2013-02-06 127 views
0

我想取消特定條件下的異步任務。 我做了以下的東西:AsyncTask進入等待狀態

MyService.java 

.... 
if(condition){ 

asyncTask.cancel(true); // its return the true as well 

} 
... 

MyAsynTask.java 

... 

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()){ // Here task goes in to wait state 
break; 
    } 
     else{ 
//continue to download file 

    } 


    } 
    return null; 
} 
... 

使用DDMS我發現,任務進入等待狀態。任何建議來解決這個問題將不勝感激。 Threads

謝謝, Yuvi

+1

你不需要檢查它isCancelled()在doInBackground(方法)。只需檢查條件n取消它。 –

+0

任務去?也許線程去? DDMS顯示任務狀態?如果線程進入等待狀態,這是正常的。 – Leonidos

+0

@Leonidos添加屏幕截圖以及... AsyncTask是隻有線程的名稱... – Yuvi

回答

1

的AsyncTask爲PoolExecutor一件工作。當你執行你的第一個任務Executor創建第一個線程並在其上執行你的任務。任務執行完成後,線程不會被刪除。它開始等待新的任務。

因此,看到AsyncTask線程處於等待狀態是正常的。

P.S.最好不要使用AsyncTask進行長時間操作。使用你自己的執行者或線程。

P.P.S. AsyncTask自4.x開始使用單線程執行程序。小心)

+0

是的,異步任務默認順序工作,我們也可以並行運行。但是,如果任務完成,它應該出現'onPostExecute'方法。 – Yuvi

+0

任何時候都可以通過調用cancel(boolean)來取消任務。調用此方法將導致對isCancelled()的後續調用返回true。調用此方法後,onCancelled(Object)將在doInBackground(Object [])返回後調用,而不是onPostExecute(Object)。爲確保儘快取消任務,如果可能(例如在循環內),應始終從doInBackground(Object [])中定期檢查isCancelled()的返回值。 – Leonidos

+0

如果取消任務onPostExecute won'不要叫。 – Leonidos

0

在您明確調用asyncTask.cancel(true);後,將調用onCancelled()方法。嘗試覆蓋下面的方法:

@Override 
protected void onCancelled() { 
    //what you want to do when the task was cancelled. 
} 
+0

你永遠不知道什麼時候會調用onCaneclled,它總是更好的想法來檢查'doInBackground'方法中的isCancelled()。 – Yuvi