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