我的應用程序使用Executor創建線程來執行任務。Android線程 - 從另一個線程運行線程並等待處理程序消息
我有一個線程,在需要時加載並返回位圖到主線程。
如果在本地找不到位圖,則使用另一個線程來執行該文件的下載。
的所有線程創建一個活套,以確保處理程序可以從該線程(如果它需要通過發送消息給處理程序去跟另一個線程)創建
public class LooperThread extends Thread
{
@Override
public void run()
{
Looper.prepare();
super.run();
Looper.loop();
}
}
主線程詢問線程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的無限循環,因此它可以維持生命,並繼續處理消息,直到它被中斷,但我不知道如何正確地做到這一點。
任何人都知道正確的做法嗎?
線程1如何停止?除非你告訴他們這樣做,否則活動者不會停下來。 – zapl
我認爲一旦線程退出了其run()方法,該線程將不再處理其消息循環中的消息。我不明確地停止線程或循環 - 線程由執行程序管理。如果消息循環仍在運行,那麼真正的問題是爲什麼Thread-2發送的消息沒有被Thread-1接收到? – JeffG
'Looper.loop()'是一個無限循環。來自內部消息隊列的消息在該循環中處理。所以你不能等待消息傳遞(因爲你等待自己)。不知道這是你做什麼。也可以看看[HandlerThread](http://developer.android.com/reference/android/os/HandlerThread.html) - 它們已經實現了looper邏輯,所以你不必這樣做。 – zapl