4

AsyncTask完了中にキャンセルできますonPostExecute()か?

それとも、一度doInBackground()完了すると、タスクをキャンセルできなくなりますか?

4

2 に答える 2

5

私が理解していることから、タスクはそのdoInBackground()状態でのみ実行されているということは、onPostExecute()タスクが完了していてキャンセルできないことを意味します。

cancel()このタスクの実行をキャンセルしようとします。タスクがすでに完了している場合、すでにキャンセルされている場合、またはその他の理由でキャンセルできなかった場合、この試行は失敗します。成功し、cancelが呼び出されたときにこのタスクが開始されていない場合、このタスクは実行されません。タスクがすでに開始されている場合、mayInterruptIfRunningパラメーターは、タスクを停止するためにこのタスクを実行しているスレッドを中断する必要があるかどうかを決定します。

このメソッドを呼び出すと、リターンonCancelled(Object)後にUIスレッドで呼び出されdoInBackground(Object[])ます。onPostExecute(Object)このメソッドを呼び出すと、それが呼び出されないことが保証されます。このメソッドを呼び出した後、isCancelled()から定期的に返される値を確認しdoInBackground(Object[])て、タスクをできるだけ早く終了する必要があります。

于 2012-07-24T06:18:49.813 に答える
1

メソッドをオーバーライドonCanceled()します。以下のサンプルコードを参照してください。

private class UpdateTask extends AsyncTask<Void, Void, Void> {

    private boolean running = true;

    @Override
    protected void onCancelled() {
        running = false;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        onUpdate();
    }

    @Override
    protected Void doInBackground(Void... params) {
         while(running) {
             publishProgress();
         }
         return null;
    }
 }
于 2012-07-24T06:21:13.530 に答える