取消未运行的异步任务调用onCancelled?

时间:2013-04-30 14:47:38

标签: android android-asynctask

我有一个从活动A执行的Asynctask B. 在B的后执行中,在某种情况下,B可能会创建自己的新实例并执行它。

我所做的是将AsyncTask声明作为B中的全局声明,并重写B的onCancelled以取消在ontetexecute上创建的新实例。

所以onDestroy of Activity A b.cancel()也会取消在onPostExecute上执行的任何AsyncTask。

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

currentPlansAsync的新实例调用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并且活动A转到onDestroy并且B被取消(b.cancel(true);) 将在B级覆盖的onCancelled称为

这样我确保取消从活动执行的AsyncTask以及从AsyncTask中执行的AsyncTask

1 个答案:

答案 0 :(得分:3)

如果在后台作业完成之前已进行onCancelled()调用,则在doInBackground()返回后立即调用

cancel()。 如果您cancel()之后AsyncTask,则不会调用它。

我建议创建一个公共方法,它将执行取消所有子任务的操作,并调用此公共方法:

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

您应该仍然调用并处理cancel()的{​​{1}}方法,以便在执行过程中停止AsyncTask执行。只需处理公共方法中的子任务,而不是doInBackground()