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 活动中有上述代码。所以,我按下一个按钮,然后进入下一个活动。如果我按下后退按钮或明确地(从按钮)再次转到上一个活动,是否有可能创建第二个计时器?

换句话说, Executors.newScheduledThreadPool(1) 是否验证我可运行对象将仅由一个线程执行并且我不会有例如两个不同的任务,它们都将每 15 秒运行一次?

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 确保只有一个线程在运行。

于 2013-11-21T10:22:40.087 回答
-1

我认为即使您切换活动,您的 Runnable 也会继续运行,因为活动上下文将由操作系统保存。

您应该在调用 Activity 的 onPause 或 onStop 时停止线程,方法是:

future.cancel(true);

然后,如果您回到活动,您可以再次安排 Runnable。

于 2013-01-15T13:27:14.227 回答