私のアプリケーションは Executor を使用してスレッドを作成し、タスクを実行します。
必要に応じてビットマップをロードしてメインスレッドに返すスレッドがあります。
ビットマップがローカルに見つからない場合は、別のスレッドを使用してファイルをダウンロードします。
すべてのスレッドはルーパーを作成して、そのスレッドからハンドラーを作成できるようにします (ハンドラーにメッセージを送信して別のスレッドと通信する必要がある場合)
public class LooperThread extends Thread
{
@Override
public void run()
{
Looper.prepare();
super.run();
Looper.loop();
}
}
メイン スレッドは、Thread-1 にビットマップの取得を要求します。ビットマップが存在する場合は、メイン スレッドに正常に返されます。ビットマップが存在しない場合、スレッド 1 はスレッド 2 にダウンロードするように要求します。Thread-1 に Handler が作成されるため、Thread-2 はこれを使用して Thread-1 にダウンロードの完了を通知できます。
問題は、Thread-1 が実行を完了し、ダウンロードが完了する前に終了するため、Thread-2 がハンドラーを介してメッセージを送信するときに、メッセージを処理するものが何もないことです。
final RequestHandler handler = new RequestHandler()
{
@Override
protected void onComplete(Object response)
{
//This never happens as Thead-1 is already finished when download is complete
DownloadCompleteData data = (DownloadCompleteData)response;
onDownloadComplete(data.success, data.downloadId, data.filePath);
}
};
myExecutor.execute(new Runnable()
{
public void run()
{
//blocking download call
DownloadCompleteData data = download(downloadRequest);
//Thread-2 now sends message back to Thread-1
handler.sendMessage(handler.obtainMessage(COMPLETE, data));
}
});
Thread-1 で無限ループを実行して、中断されるまで生き続けてメッセージを処理し続ける必要があると思いますが、これを適切に行う方法がわかりません。
誰でもそれを行う正しい方法を知っていますか?