웹에서 파일을로드 할 수있는 파일 캐시를 작성했습니다. 활동은이 파일 캐시에 요청을 보내고 요청 된 파일이 다운로드되었을 때 알려주는 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);
}
}
고마워요,하지만 그건 질문이 아니 었습니다. 표시된 코드를 확인하십시오 (아래로 스크롤하십시오) - 모든 파일이 처리 된 후 이미 인 텐트를 보내고 있음을 나타냅니다. 내 질문은 : 각각의 개별 항목에 대해 해당 Intent DURING Thread.run() 처리를 어떻게 보내면됩니까? 그 메시지에 String이나 Objects를 넣어야하는데, 그것이 작동하는지 그리고 어떻게 작동하는지 모르겠습니다. –
각 항목 다음에 if (processedElement! = null && processedElement.receiver! = null)가 있는지 확인 했습니까? –
그게 쉽지? 나는 항상 브로드 캐스트를 보내는 것이 UI 쓰레드를 감염 시키므로 별도의 쓰레드 (비 UI 쓰레드)에서 불가능하다고 생각했다. 이 팁을 주셔서 감사합니다. –