2012-03-15 6 views
0

:一度だけ起こるタスクについて話すとき(キャンセル)と定期的にスケジュールされたタスクのAndroid Devのリファレンスから

public abstract boolean cancel (boolean mayInterruptIfRunning) 

If the task has already started, then the mayInterruptIfRunning parameter 
determines whether the thread executing this task should be interrupted in 
an attempt to stop the task. 

これは、私にとっては明らかです。しかし、私が定期的な仕事をしているとき、私はそれが現在の "仕事"を終わらせるようにしたいが、新しい仕事を開始しない。

これはまっすぐなものなのですか?引数をtrueに設定すると、現在のタスクが終了する前にそのタスクを停止し、falseに変更して現在実行中のタスクがある場合は何もしません。これは正しいですか?

私は何をしたいのですか?私はどういうわけかそれが実行されているかどうかを見つけるためにタスクをポーリングし、それが見つからないときにキャンセルする必要がありますか?

答えて

0

あなたの環境について詳しくはわかっていませんが、定期的なタスクがスケジュールされているjava.util.concurrentのエグゼキュータを使用していることを理解している限り、

基本的にはcancel()のパラメータは、実行中のスレッドを強制的に終了するかどうかを決定します。 falseに設定されている場合、プログラマは、実行中のスレッドを中断するタイミングをisCanceled()FutureRunnableから派生したものを参照)にチェックするだけで済みます。

cancel(false)メソッドをSheduledFutureとすると、Executorが返されます。これにより、実行中のタスクが中断されず、実行中のタスクが再実行されなくなります。それを呼び出すと、Future.get()は例外をスローします。これにより、エグゼキュータは次にスケジュールされた時間に実行されません。

0

使用ScheduledThreadPoolExecutor.shutdown()

... ... 
// At some point in the future if you want reject next periodic task submit 
// after waiting for current periodic task finish. 
scheduledThreadPoolExecutor.shutdown(); // <-- this will reject next periodic task submit. 
scheduledThreadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS); // <-- this will wait current periodic task finish. 
... ... 

awaitTermination())(シャットダウン後に呼び出す必要があり、明確にAndroidのAPIから記載されていない、しかし、あなたはofficial Java APIから詳細なドキュメントを見つけることができます。

関連する問題