2011-04-25 170 views
4

我在線程內運行一個線程,並且我想在線程完成後返回一個值,我試圖做join()但阻止UI線程的問題。 我該如何等待線程完成,然後返回值而不阻塞UI線程?等待線程完成而不阻塞UI線程

Boolean foo(){ 

myThread mt = new myThread(); 
mt.start();  
return mt.isSentSuccessfully; 

} 
+0

提供了一些代碼,可能會有幫助。 – mre 2011-04-25 14:17:42

+0

我添加了一些代碼。 – Jimmy 2011-04-25 15:06:20

+0

你有什麼理由不能完成這一輪,並將UI後臺線程信號發送到UI? (這是做事的正常方式,因此避免了輪詢。) – 2011-04-25 15:12:40

回答

4

您可以使用Android的AsyncTaskhttp://developer.android.com/reference/android/os/AsyncTask.html 當我使用它,我把後臺任務在擴展AsyncTask類和覆蓋onPreExecute()onPostExecute(..)方法來顯示/隱藏ProgressDialog。它工作得非常好。

+0

我已經看過它,但我不認爲它最適合什麼即時通訊嘗試做,我怎麼能等待它完成,然後返回調用方法內的值? – Jimmy 2011-04-25 14:10:13

+0

我不知道這是否可能。你說你不想阻塞用戶界面,但你希望調用方法(可能來自當前Activity)調用一個長時間運行的方法並等待它返回。您可能能夠讓長時間運行的線程在完成任務時調用一個活動。 – Haphazard 2011-04-25 14:23:31

+2

@Fevos:如果你不阻塞,直到其他線程完成,你可以從方法返回什麼值?唯一的方法就是不要在UI線程中調用你的方法,將工作卸載到後臺線程......這正是AsyncTask所做的。 – blaze 2011-04-25 14:31:17

3

如果你真的不想使用的AsyncTask,那麼你可能想定義一個Handler

然後在後臺線程發送消息給主線程,當後臺作業的東西,如完成:

ActivityMainThreadClassName.this.myUpdateHandler.sendMessage(m); 

其中myUpdateHandler是您創建的處理程序。

0

你試過投票Thread.getState()

事情是這樣的:

android.os.Handler h = new Handler(); 
h.postDelayed(new Runnable() { 
public void run() { 
     if (thread.getState() == Thread.State.TERMINATED) { 
      // your code here 
      return; 
     } 
     h.postDelayed(this, 1000); 
}, 1000); 

該樣品應輪詢線程狀態每一秒......(我沒有測試它