Canceling AsyncTask that is not running Calls onCancelled?

天大地大妈咪最大 提交于 2019-12-25 05:56:09

问题


I have an Asynctask B that is executed from activity A. On post execute of that B, on a certain condition B might create a new instance of itself and execute it.

What i did is put the AsyncTask declaration as global inside the B and overridden the onCancelled of B to cancel the new instance that is created onpostexecute.

so onDestroy of Activity A b.cancel() will also cancel the any AsyncTask executed onPostExecute.

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

And new instance of currentPlansAsync is called onPostExecute as follows:

 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();
      }

   }

My question is that if AsyncTask B has stopped execution and it has executed another asynctask C and activity A goes to onDestroy and B is cancelled ( b.cancel(true);) will onCancelled that is overridden in class B be called ??

This is so i ensure that i cancel the AsyncTask that was executed from the activity and also the AsyncTask executed from within that AsyncTask


回答1:


onCancelled() is called immediately after the doInBackground() returns, if a cancel() call has been made before the background job has finished. It will not be called if you cancel() the AsyncTask after that.

I would recommend to create a public method that will do what will cancel all child tasks, and call this public method:

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

You should still call and handle the cancel() method of the AsyncTasks in order to stop the doInBackground() execution if it is in the middle of execution. Just deal with the child tasks in the public methods instead of in the onCancelled().



来源:https://stackoverflow.com/questions/16302769/canceling-asynctask-that-is-not-running-calls-oncancelled

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!