2012-01-07 17 views
0

私はこのようなコードでScheduledThreadPoolExecutorを使用して実行するバックグラウンドタスクを持っています。Android ScheduledThreadPoolExecutorは遅延タスクをすぐに実行します

executor.scheduleWithFixedDelay(new BackgroundSync(), 0, 15, TimeUnit.MINUTES); 

BackgroundSyncはRunnableを実装します。

ユーザイベントから、遅延イベントが今すぐ実行され、15分タイマーがオフになることはありません。

いくつかの要件:

  • だけそのがまだ実行されていない場合、私はすぐにBackgroundSyncをスケジュールすることができるはずユーザイベントをオフに基づいて、時間
  • で実行されている一つの「BackgroundSync」があるはずです。
+0

遅延実行時と実行時を区別する方法を教えてください。何に基づいて? –

+0

これを明確にするために、この定期的なタスクは15分ごとに直ちにスケジュールされます。しかし、ユーザーが特定のボタンをクリックした場合、私はそのタスクが既に実行されていないと仮定してすぐに実行する必要があります。 – bluphoenix

答えて

2

scheduleWithFixedDelayは、ScheduledFutureを返します。それを呼び出すときは、これをどこかに保存して、即時実行したい場合は存在するかどうかを確認してください。その後、cancelメソッドを使用して予定された未来を取り消し、即時実行のために再度実行可能なスケジュールを設定することができます。

2

カブコの解決策はおそらくあなたの得意と同じくらい良いですが、問題があります。

cancel()メソッドは、開始前にタスクがキャンセルされた場合はtrue、タスクが既に実行されている場合、または以前にキャンセルされた場合はfalseを返します。問題は、タスクが現在実行中の場合、cancel()trueを返します。したがって、タスクを再サブミットするかどうかを決定するために、他のメカニズムを実装する必要があります。

+0

私はandroid java docを読んできました。これらの将来のオブジェクトが実際にどのように定期的なタスクで実際に動作するのかが疑問です。通常のタスクでは、単一スレッドタスクの実行を表します。私がキャンセルすると、私は現在の実行をキャンセルするだけですが、私の場合はどういう意味ですか?またはすべての定期的なタスク。 – bluphoenix

+0

スケジュールされたタスクは定期的なタスクではなく、指定された将来の時点以降に実行されるタスクです。あなたの "定期的な仕事"ビルディングブロックを設計し、あなたが 'cancel()'に何をしたいのか、そしてそれを実装する方法はあなた次第です。 –

関連する問題