2012-05-03 49 views
1

我的應用程序使用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的無限循環,因此它可以維持生命,並繼續處理消息,直到它被中斷,但我不知道如何正確地做到這一點。

任何人都知道正確的做法嗎?

+0

線程1如何停止?除非你告訴他們這樣做,否則活動者不會停下來。 – zapl

+0

我認爲一旦線程退出了其run()方法,該線程將不再處理其消息循環中的消息。我不明確地停止線程或循環 - 線程由執行程序管理。如果消息循環仍在運行,那麼真正的問題是爲什麼Thread-2發送的消息沒有被Thread-1接收到? – JeffG

+0

'Looper.loop()'是一個無限循環。來自內部消息隊列的消息在該循環中處理。所以你不能等待消息傳遞(因爲你等待自己)。不知道這是你做什麼。也可以看看[HandlerThread](http://developer.android.com/reference/android/os/HandlerThread.html) - 它們已經實現了looper邏輯,所以你不必這樣做。 – zapl

回答

0

我不知道,如果你想這樣做,這樣一來,但是你可以在線程1

if(bitmapIsntFound) 
{ 
    Thread-2.start(); 
    try 
    { 
     Thread-1.wait(); 
    } 

    catch(InterruptedException e) 
    { 
    System.out.println("Thread-1 
    } 

} 

嘗試類似的代碼,這會爲您啓動第二個線程下載的位圖,然後告訴第一個線程等待第二個線程繼續運行。第二次下載完成後,您將需要調用Thread-1.notify()重新啓動Thread-1。

因爲您暫停了線程1中游,它不會超過try {} catch(){}語句,因此在線程1恢復時確保下載完成,並且可以將其調用線程。