0

アクティビティ A から実行される Asynctask B があります。その B の実行後、特定の条件で、B はそれ自体の新しいインスタンスを作成して実行する可能性があります。

私がしたことは、AsyncTask 宣言を B 内のグローバルとして配置し、B の onCancelled をオーバーライドして、onpostexecute で作成された新しいインスタンスをキャンセルすることです。

そのため、アクティビティの onDestroy 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 を確実にキャンセルするためです。

4

1 に答える 1

3

onCancelled()バックグラウンド ジョブが終了する前に呼び出しが行われたdoInBackground()場合は、リターンの直後に呼び出されます。それ以降はcancel()呼び出されません。cancel()AsyncTask

すべての子タスクをキャンセルするパブリック メソッドを作成し、このパブリック メソッドを呼び出すことをお勧めします。

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

実行中の場合は、実行を停止するために s のcancel()メソッドを呼び出して処理する必要があります。の代わりにパブリック メソッドで子タスクを処理するだけです。AsyncTaskdoInBackground()onCancelled()

于 2013-04-30T15:06:19.307 に答える