私のアプリケーションは、Executorを使用してタスクを実行するスレッドを作成します。Androidスレッド - 別のスレッドからスレッドを実行し、ハンドラメッセージを待っています
私は必要に応じてメインスレッドにビットマップをロードして返します。
ビットマップがローカルに見つからない場合は、別のスレッドを使用してファイルをダウンロードします。
すべてのスレッドは、ハンドラが(それがハンドラにメッセージを送信することにより、別のスレッドに話をする必要がある場合には)そのスレッドから作成することができることを確実にするためにルーパーを作成
public class LooperThread extends Thread
{
@Override
public void run()
{
Looper.prepare();
super.run();
Looper.loop();
}
}
メインスレッドは、Thread-1尋ねますビットマップを取得します。ビットマップが存在する場合、それはメインスレッドに正常に返されます。ビットマップが存在しない場合、スレッド1はスレッド2にダウンロードを要求する。 HandlerはThread-1で作成されるので、Thread-2はダウンロードが完了したときにThread-1にそれを伝えることができます。
問題は、ダウンロードが完了する前にスレッド1が実行を完了して終了するため、スレッド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));
}
});
私はそれが生き続ける、それが中断されるまで、メッセージの処理を続けることができるようにスレッド-1で無限ループを実行する必要があると思うが、私はこれを正しく動くかどうかはわかりません。
誰でも正しい方法を知っていますか?
Thread-1はどのように停止しますか?あなたがそうするように言わない限り、ループは止まらない。 – zapl
スレッドがrun()メソッドを終了すると、スレッドはメッセージループでメッセージを処理しなくなると想定しました。私は明示的にスレッドを停止しないか、ルーパースレッドはExecutorsによって管理されます。メッセージループがまだ実行されている場合、実際の質問は、スレッド2から送信されたメッセージがスレッド1によって受信されないのはなぜですか? – JeffG
'Looper.loop()'は無限ループです。内部メッセージキューからのメッセージは、そのループで処理されます。だからあなたはメッセージが届くのを待つことができません(自分で待つので)。それがあなたのことなのかどうかはわかりません。また、[HandlerThread](http://developer.android.com/reference/android/os/HandlerThread.html)を見てください - 彼らはルーパーロジックを既に実装しているので、そうする必要はありません。 – zapl