我有一个从活动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
答案 0 :(得分:3)
onCancelled()
调用,则在doInBackground()
返回后立即调用 cancel()
。
如果您cancel()
之后AsyncTask
,则不会调用它。
我建议创建一个公共方法,它将执行取消所有子任务的操作,并调用此公共方法:
public void cancelChildTasks()
{
if(currentPlansAsync != null)
{
currentPlansAsync.cancel(true);
currentPlansAsync.cancelChildTasks();
}
}
您应该仍然调用并处理cancel()
的{{1}}方法,以便在执行过程中停止AsyncTask
执行。只需处理公共方法中的子任务,而不是doInBackground()
。