0

我有一个从活动 A 执行的 Asynctask B。在该 B 的后执行时,在特定条件下 B 可能会创建一个自身的新实例并执行它。

我所做的是将 AsyncTask 声明作为全局放在 B 中并覆盖 B 的 onCancelled 以取消在 postexecute 上创建的新实例。

所以 Activity A b.cancel() 的 onDestroy 也会取消在 PostExecute 上执行的任何 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

4

1 回答 1

3

onCancelled()如果在后台作业完成之前进行doInBackground()了调用,则在返回后立即调用。如果你在那之后cancel()它不会被调用。cancel()AsyncTask

我建议创建一个公共方法来取消所有子任务,并调用这个公共方法:

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

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

于 2013-04-30T15:06:19.307 回答