2

実行中のAsyncTaskの.cancel(boolean)メソッドはどのように機能しますか?ドキュメントは次のとおりです。

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

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

2番目の段落は、cancelが呼び出された後(isCancelled()を定期的にチェックすることにより)、doInBackgroundメソッドからできるだけ早く戻るのはプログラマーの責任であることを意味します。しかし、テストでは、cancelが呼び出された後、これを行わなくても、AsyncTask(doInBackgroundメソッド)がすぐに停止するように見えます。誰かがこれを説明できますか?(Logcatは、cancelが呼び出されたときに何が起こっているかを示しません)。

protected Void doInBackground(Void... V) {
            for (int v=3;v>0;v--){
                publishProgress(v);
                try {Thread.sleep(1500);} catch (InterruptedException e) {}
            } 
            return null;
         }

また、これはmayInrerruptIfRunningの指定された値に関係なく発生するため、この値がどこにあるかを説明できれば、それも非常に高く評価されます。

4

2 に答える 2

2

のようないくつかのコアメソッド(「ブロッキングメソッド」)がThread.sleep()あり、それら自体がスレッドの中断をチェックして例外をスローします。

于 2012-07-28T22:22:18.647 に答える
0

AsyncTaskのdoInBackgroundにチェックを入れることができisRunning()、そうであれば、nullを返します。それ以外の場合は、doInBackgroundが実行された後でのみキャンセルできます。

于 2012-07-28T22:25:00.090 に答える