2012-10-11 3 views
0

웹에서 파일을로드 할 수있는 파일 캐시를 작성했습니다. 활동은이 파일 캐시에 요청을 보내고 요청 된 파일이 다운로드되었을 때 알려주는 BroadcastReceiver의 이름과 동작을 제공합니다.실행중인 스레드에서 브로드 캐스트를 보내는 방법

이 캐시는 작동하지만 약간의 단점이 있습니다.

다운로드 대기열에 많은 파일이있는 경우 모든 다운로드를 처리 한 후 즉시 활동을 알립니다. 다운로드 한 파일마다 브로드 캐스트를 보내고 싶습니다.

다음은 삭제 된 코드입니다. 현재, Handler는, Thread.run() 내의 모든 파일을 처리 한 후에 해열됩니다. 나는 내에서 방송을 보내고 싶다. Thread.run() 중에 뭔가를 수행하는 선호되는 방법은 무엇입니까 (브로드 캐스트 보내기)?

미리 감사드립니다.

public abstract class MyFileCache { 

    private static class CacheElement { 
     private File file; 
    } 

    private static class QueueElement { 
     private long action; 
     private String filename = ""; 
     private long id; 
     private String receiver = ""; 
    } 

    private static class ProcessedElement { 
     private long action; 
     private File file; 
     private long id; 
     private String receiver = ""; 
    } 

    private Map<String, CacheElement> cache = new ConcurrentHashMap<String, CacheElement>(); 
    private Context context; 
    private Map<String, ProcessedElement> processed = new ConcurrentHashMap<String, ProcessedElement>(); 
    private Map<String, QueueElement> queue = new ConcurrentHashMap<String, QueueElement>(); 

    public MyFileCache(Context context) { 
     this.context = context; 
    } 

    private void doThread() { 
     final Handler handler = new Handler() { 

      @Override 
      public void handleMessage(Message message) { 

       try { 
        for (Map.Entry<String, ProcessedElement> entry : processed.entrySet()) { 
         // Currently: Processing all fetched files at once 
         // Send for all entries a broadcast to the requesting activities 
         ProcessedElement processedElement = entry.getValue(); 
         if (processedElement != null && processedElement.receiver != null) { 
          processSendBroadcast(processedElement.receiver, 
            processedElement.action, processedElement.id); 
         } 

         deleteFromProcessed(entry.getKey()); 
        } 
       } catch (NullPointerException exception) { 
       } 
      } 
     }; 

     new Thread() { 

      @Override 
      public void run() { 
       for (Map.Entry<String, QueueElement> entry : queue.entrySet()) { 
        QueueElement queueElement = entry.getValue(); 
        if (queueElement != null) { 
         File file = fetch(entry.getKey(), queueElement.id, queueElement.filename, 
           queueElement.receiver, queueElement.action); 
         if (file != null) { 
          // Wish: Sending a broadcast to the requesting activity for each fetched file 
         } 
        } 
       } 

       handler.sendEmptyMessage(0); 
      } 
     }.start(); 
    } 

    private void deleteFromProcessed(String url) { 
     if (processed.containsKey(url)) { 
      ProcessedElement processedElement = processed.get(url); 
      if (processedElement != null) { 
       processed.remove(url); 
      } 
     } 
    } 

    // Send broadcast 
    private void processSendBroadcast(String receiver, long action, long id) { 
     Intent intent = new Intent(); 
     intent.putExtra("ACTION", action); 
     intent.putExtra("ID", id); 
     intent.setAction(receiver); 
     context.sendBroadcast(intent); 
    } 
} 

답변

0

나는 "FILE_COMPLETED"조치와 함께 Intent을 전송, 파일의 이름을 추가 문자열을 추가하는 말을하고 모든 활동이 같은 행동과 BroadcastReceiver을 등록해야하지만, 내 여부 문자열 추가 비교 것 Intent은 활동이 원했던 파일과 일치합니다.

+0

고마워요,하지만 그건 질문이 아니 었습니다. 표시된 코드를 확인하십시오 (아래로 스크롤하십시오) - 모든 파일이 처리 된 후 이미 인 텐트를 보내고 있음을 나타냅니다. 내 질문은 : 각각의 개별 항목에 대해 해당 Intent DURING Thread.run() 처리를 어떻게 보내면됩니까? 그 메시지에 String이나 Objects를 넣어야하는데, 그것이 작동하는지 그리고 어떻게 작동하는지 모르겠습니다. –

+0

각 항목 다음에 if (processedElement! = null && processedElement.receiver! = null)가 있는지 확인 했습니까? –

+0

그게 쉽지? 나는 항상 브로드 캐스트를 보내는 것이 UI 쓰레드를 감염 시키므로 별도의 쓰레드 (비 UI 쓰레드)에서 불가능하다고 생각했다. 이 팁을 주셔서 감사합니다. –

관련 문제