2010-08-17 60 views
1

PrintStatusTask解析gmail收件箱的內容,查找各種感興趣的項目以進行報告。但是根據調試器爲每個PrintStatusTask()。execute()創建一個新的AsyncTask。這些任務不應該退出?他們是否必須手動殺死?殺死Android AsyncTask的是什麼?

public class Controller extends Activity { 
    ... 
    private boolean applyMenuChoice(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.menuStatus: 
      new PrintStatusTask().execute(); 
      ... 
    class PrintStatusTask extends AsyncTask<Void, String, Void> { 
     @Override 
     protected Void doInBackground(Void... unused) { 
      ... 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void unused) { 
      this.cancel(true); 
     } 
    } 
} 

回答

0

如果你到任務的參考周圍,你可以調用它的cancel方法來取消它。否則,只要您的應用程序執行此操作,或直到它們從doInBackground和(如果存在)onPostExecute函數返回,它們就會生效。

+0

PrintStatusTask在任務完成後退出。但是,在PrintStatusTask(請參閱更新後的代碼片段)中添加 this.cancel(true)到onPostExecute()也不會終止該任務。我猜想任務會在電池耗盡並且設備關閉後消失,但不喜歡該解決方法。任何其他想法? – jacknad 2010-08-17 23:01:53

+1

在'onPostExecute'中調用'cancel'是無用的,因爲只有在任務完成或被取消後纔會調用cancel。你必須在別處叫它。例如,如果您在創建Activity時將「AsyncTask」字段添加到「Activity」並將任務保存在那裏,那麼稍後可以在活動的「onDestroy」上執行「mPrintTask.cancel」(如果適用)。當然,您必須先選擇任務的生命週期,然後才能找到適當的地方來取消它。 – 2010-08-18 00:55:10

+0

這就是我的想法。除了onPostExecute被調用,但AsyncTask仍然顯示爲在調試窗口中運行。這可能是Eclipse/Android環境中的一個缺陷,即使任務已經真正退出,它也不能從調試窗口中正確刪除AsyncTask指示? – jacknad 2010-08-18 11:18:02

5

好夥計我很抱歉,但我必須告訴你,你錯了。 一個AsyncTask(幾乎)從未被殺死。調用AsyncTask.cancel不會終止任務。

通過調用取消(布爾值)引述的AsyncTask

任務可以在任何時間被取消的文檔。調用此方法將導致對isCancelled()的後續調用返回true。調用此方法後,onCancelled(Object)將在doInBackground(Object [])返回後調用,而不是onPostExecute(Object)。爲了確保任務是儘可能快地取消,應始終從doInBackground檢查isCancelled(返回值)定期(對象[]),如果可能的話(例如在一個循環中。)

閱讀文檔可以是有用的...所以我總結它爲你,但因爲我已經在另一篇文章中回答,我發送給你:How can I make asynchronous URL connections on Android?

我給你的問題的解決方法,是的,有些時間,一些AsyncTask被殺害。但我不會推薦使用它們,它們是無用的。但是,既然你的AsyncTasks運行應該顯示一個「等待」狀態,如果他們完成了任務。否則,你的任務沒有完成,我從來沒有聽說過一些adb線程看bug。

問候!

+0

嗨,也許你提供的鏈接是錯誤的,因爲我在你鏈接的文章中看不到你的回答。無論如何....可以在'doInBackground()'方法內調用'isCancelled()'解決問題嗎? – ocramot 2015-04-19 12:38:26