2012-03-30 29 views
4

的Android的AsyncTask我創建了一個的AsyncTask,並在其doInBackground()方法我開始這樣一個線程:與線程

private class myAsyntask extends Asynctask{ 

    doInBackground(){ 
    Thread t = new Thread(new Runnable(){ 
    public void run() 
    { 
     while(someBoolean!=true){ 
     Thread.currentThread.sleep(100); 
     } 
    } 
    }); 
    } 
    onPostExecute(){ 
    //do something related to that variable 
    } 
} 

問題,我面對的是Thread.sleep()第一次迭代後,onPostExecute()被調用,而不是我想那asynctask會在後臺運行這個線程,當這個boolean值爲true onPostexecute()被調用時,我無法理解爲什麼會發生這種情況?

回答

11

的AsyncTask自動爲您創建一個新的線程,讓你在doInBackground()所做的一切都是在另一個線程。
你在做什麼,這是:

  1. 的AsyncTask創建一個新線程,並運行doInBackground()
  2. 從AsyncTask-Thread創建一個新的主題(t)。
  3. doInBackground()已完成,因爲它所做的只是創建線程t並跳轉到onPostExecute()
  4. 線程t仍然會在後臺運行(但是,您不要在t上調用start(),這意味着它不會啓動)。

相反,你希望你的doInBackground()方法看起來是這樣的:

doInBackground(){ 
    while(someBoolean!=true){ 
     //Perform some repeating action. 
     Thread.sleep(100); 
    } 
} 
+0

感謝我的理解是什麼問題,現在建議等待它的完成。 – user1254554 2012-03-30 08:43:41

+0

@ user1254554好:)如果它對你有幫助,你應該接受一個答案(點擊左邊分數下的複選標記)。這既關閉了問題,也回答了回答的人。 – Jave 2012-03-30 08:47:11

+0

'doInBackground()'中的線程是否指向後臺線程?我希望它不會阻止用戶界面。 – Stallman 2014-10-08 10:36:28

1

onPostExecute只能在doInBackgroundreturn -ed時才能調用。在代碼中,唯一可能的方式會發生這種情況是sleep拋出ExceptionInterruptedException ??)

3

首先,在你的代碼,你甚至不啓動線程t,讓所有發生在doInBackground是創造新線程,然後移動到onPostExecute()

其次,你甚至不需要單獨的線程,因爲doInBackground()爲您處理此,所以你可以使用類似

doInBackground(){ 
    while(someBoolean!=true){ 
     Thread.currentThread.sleep(100); 
    } 
} 

,如果你願意的話,但是,與單獨的線程堅持,你可以啓動線程,並通過使用.join();

doInBackground(){ 
    Thread t = new Thread(new Runnable(){ 
     public void run() { 
      while(someBoolean!=true){ 
       Thread.currentThread.sleep(100); 
      } 
     } 
    }); 
    t.start(); 
    t.join(); 
} 
+0

謝謝,我現在明白了這個問題 – user1254554 2012-03-30 08:44:23