【问题标题】:Canceling AsyncTask that is not running Calls onCancelled?取消未运行 Calls onCancelled 的 AsyncTask?
【发布时间】:2013-04-30 14:47:38
【问题描述】:

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

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

因此,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 会被调用吗??

这是为了确保我取消从 Activity 执行的 AsyncTask 以及从该 AsyncTask 中执行的 AsyncTask

【问题讨论】:

  • 任务完成后不能取消。但是您可以将onCancelled 方法设为公开并调用它。

标签: android android-asynctask


【解决方案1】:

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

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

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

您仍应调用并处理AsyncTasks 的cancel() 方法,以停止正在执行的doInBackground() 执行。只需在公共方法中而不是在onCancelled() 中处理子任务。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多