2013-04-30 70 views
0

我有一個從活動A執行的Asynctask B. 在該B的post執行中,在某種情況下,B可能會創建一個自己的新實例並執行它。取消AsyncTask未運行調用onCancelled?

我所做的是將AsyncTask聲明作爲全局內部的B並覆蓋B的onCancelled以取消創建onpostexecute的新實例。

so onDestroy of Activity A b.cancel()也將取消執行onPostExecute的任何AsyncTask。 currentPlansAsync的

@Override 
    protected void onCancelled() 
    { 
     if(currentPlansAsync != null) 
     { 
     currentPlansAsync.cancel(true); 
     } 
     super.onCancelled(); 
    } 

,新實例稱爲onPostExecute如下:

private void processAfterFailure() 
    { 

     if(this.counter < 3) 
     { 
     ProgressDialog progressDialog = 
      GeneralUtils.showProgressDialog(parentActivity, parentActivity.getResources().getString(string.WaitDialogTitle), 
       parentActivity.getResources().getString(string.WaitDialogMessage)); 
     this.counter++; 
     currentPlansAsync = new CurrentPlansAsync(parentActivity, application, progressDialog, application.planBL, this.counter); 
     currentPlansAsync.execute(); 

     } 
     else 
     { 
     Toast.makeText(parentActivity, parentActivity.getResources().getString(string.SERVICE_ERROR), Toast.LENGTH_LONG).show(); 
     } 

    } 

我的問題是,如果的AsyncTask B已停止執行,並已執行另一個的AsyncTask C和活動前進到的onDestroy和B被取消(b.cancel(true);) 將onCancelled在B類中被覆蓋被稱爲??

這讓我確保我取消從活動執行的AsyncTask,並從該的AsyncTask

+0

完成後您無法取消任務。但是你可以公開'onCancelled'方法並改爲調用它。 – vorrtex 2013-04-30 15:17:34

回答

3

onCancelled()內執行的AsyncTask是doInBackground()返回後立即調用,如果cancel()在後臺作業完成之前已經進行了調用。 如果您之後 AsyncTask將不會被調用。

我建議創建一個公共方法,會做什麼,將取消所有的子任務,並調用這個公共方法:

public void cancelChildTasks() 
{ 
    if(currentPlansAsync != null) 
    { 
     currentPlansAsync.cancel(true); 
     currentPlansAsync.cancelChildTasks(); 
    } 
} 

你應該仍然可以調用和處理AsyncTask S的順序cancel()方法如果它正在執行中,則停止執行doInBackground()。只需在公共方法中處理孩子任務,而不是在onCancelled()中處理。