非同期タスクを使用して画像をアップロードし、結果を取得します。
画像をアップロードしているときに、onPreExecute() メソッドで次のように記述された進行状況ダイアログが表示されます。
protected void onPreExecute() {
uploadingDialog = new ProgressDialog(MyActivity.this);
uploadingDialog.setMessage("uploading");
uploadingDialog.setCancelable(true);
uploadingDialog.show();
}
戻るボタンを押すと、setCancelable(true) によりダイアログが消えるのは明らかです。
しかし、(当然ですが)非同期タスクは停止しません。
では、どうすればこれを修正できるでしょうか? 戻るボタンを押したときに、ダイアログと非同期タスクの両方をキャンセルしたいです。何かアイデアはありますか?
ベストアンサー1
SDKから:
タスクのキャンセル
タスクは、cancel(boolean) を呼び出すことでいつでもキャンセルできます。このメソッドを呼び出すと、後続の isCancelled() 呼び出しは true を返します。
このメソッドを呼び出した後、doInBackground(Object[]) が返された後、onPostExecute(Object) ではなく onCancelled(Object) が呼び出されます。
タスクができるだけ早くキャンセルされるようにするには、可能であれば (たとえばループ内で)、doInBackground(Object[]) から isCancelled() の戻り値を定期的にチェックする必要があります。
したがって、コードはダイアログ リスナーに適しています。
uploadingDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
myTask.cancel(true);
//finish();
}
});
さて、SDKから先ほど述べたように、タスクがキャンセルされたかどうかを確認する必要があります。そのためには、キャンセルされました()onPreExecute() メソッド内。
例えば:
if (isCancelled())
break;
else
{
// do your work here
}