我在線程內運行一個線程,並且我想在線程完成後返回一個值,我試圖做join()但阻止UI線程的問題。 我該如何等待線程完成,然後返回值而不阻塞UI線程?等待線程完成而不阻塞UI線程
Boolean foo(){
myThread mt = new myThread();
mt.start();
return mt.isSentSuccessfully;
}
我在線程內運行一個線程,並且我想在線程完成後返回一個值,我試圖做join()但阻止UI線程的問題。 我該如何等待線程完成,然後返回值而不阻塞UI線程?等待線程完成而不阻塞UI線程
Boolean foo(){
myThread mt = new myThread();
mt.start();
return mt.isSentSuccessfully;
}
您可以使用Android的AsyncTask
。 http://developer.android.com/reference/android/os/AsyncTask.html 當我使用它,我把後臺任務在擴展AsyncTask
類和覆蓋onPreExecute()
和onPostExecute(..)
方法來顯示/隱藏ProgressDialog
。它工作得非常好。
我已經看過它,但我不認爲它最適合什麼即時通訊嘗試做,我怎麼能等待它完成,然後返回調用方法內的值? – Jimmy 2011-04-25 14:10:13
我不知道這是否可能。你說你不想阻塞用戶界面,但你希望調用方法(可能來自當前Activity)調用一個長時間運行的方法並等待它返回。您可能能夠讓長時間運行的線程在完成任務時調用一個活動。 – Haphazard 2011-04-25 14:23:31
@Fevos:如果你不阻塞,直到其他線程完成,你可以從方法返回什麼值?唯一的方法就是不要在UI線程中調用你的方法,將工作卸載到後臺線程......這正是AsyncTask所做的。 – blaze 2011-04-25 14:31:17
如果你真的不想使用的AsyncTask,那麼你可能想定義一個Handler
然後在後臺線程發送消息給主線程,當後臺作業的東西,如完成:
ActivityMainThreadClassName.this.myUpdateHandler.sendMessage(m);
其中myUpdateHandler是您創建的處理程序。
你試過投票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);
該樣品應輪詢線程狀態每一秒......(我沒有測試它)
提供了一些代碼,可能會有幫助。 – mre 2011-04-25 14:17:42
我添加了一些代碼。 – Jimmy 2011-04-25 15:06:20
你有什麼理由不能完成這一輪,並將UI後臺線程信號發送到UI? (這是做事的正常方式,因此避免了輪詢。) – 2011-04-25 15:12:40