0
private ScheduledFuture<?> future;
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);


Runnable runnable = new Runnable() {
     @Override
     public void run() {
              //my code...

     }
};
future = scheduler.scheduleAtFixedRate(runnable, 0, 15,TimeUnit.SECONDS);

Androidアクティビティに前述のコードがあります。ボタンを押すと、次のアクティビティに進みます。戻るボタンを押すか、(ボタンから) 明示的に前のアクティビティに再度戻ると、2 番目のタイマーが作成される可能性はありますか?

つまり、Executors.newScheduledThreadPool(1) は、ランナブルが 1 つのスレッドによってのみ実行され、たとえば、両方が 15 秒ごとに実行される 2 つの異なるタスクがないことを確認しますか?

4

2 に答える 2

1

ドキュメントhttp://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.htmlから

    public ScheduledFuture<?> scheduleAtFixedRate (Runnable command, long initialDelay, long period, TimeUnit unit)

API レベル 1 で追加 指定された初期遅延の後に最初に有効になり、その後指定された期間で有効になる定期的なアクションを作成して実行します。つまり、実行は initialDelay の後に開始され、次に initialDelay+period、次に initialDelay + 2 * period というようになります。タスクの実行で例外が発生した場合、後続の実行は抑制されます。それ以外の場合、タスクはエグゼキューターのキャンセルまたは終了によってのみ終了します。このタスクの実行にその期間よりも時間がかかる場合、後続の実行は遅れて開始される可能性がありますが、同時に実行されることはありません。

したがって、AFAIU のプール 1 のサイズと scheduleAtFixedRate により、実行中のスレッドが 1 つだけになることが保証されます。

于 2013-11-21T10:22:40.087 に答える
-1

アクティビティコンテキストはOSによって保存されるため、アクティビティを切り替えてもRunnableは実行され続けると思います。

アクティビティのonPauseまたはonStopが呼び出されたら、次を使用してスレッドを停止する必要があります。

future.cancel(true);

その後、アクティビティに戻った場合は、Runnableを再度スケジュールできます。

于 2013-01-15T13:27:14.227 に答える