0

Web からファイルをロードできるファイルキャッシュを作成しました。アクティビティは、このファイルキャッシュにリクエストを送信し、リクエストされたファイルがダウンロードされたときに通知を受ける BroadcastReceiver の名前とアクションを指定します。

このキャッシュは機能していますが、小さな欠点があります。

ダウンロード キューに多数のファイルがある場合、すべてのダウンロードが処理された後、アクティビティが一度に通知されます。ダウンロードしたファイルごとにブロードキャストを送信したいと思います。

これがコードを削除したものです。現在、ハンドラは 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);
    }
}
4

1 に答える 1

0

Intent「FILE_COMPLETED」アクションで送信し、ファイルの名前を含む文字列エクストラを追加し、すべてのアクティビティに同じアクションを登録させますが、アクティビティ内の文字列エクストラがファイルと一致BroadcastReceiverするかどうかを比較します。Intent

于 2012-10-11T11:31:01.803 に答える