2

我正在使用 Java executorservice 在我的一个应用程序中创建超时效果。经过一段时间后,他们的执行器服务开始并将用户从他们的会话中注销。但是在 Android 设备上,当设备进入睡眠状态时,执行线程被挂起。设备唤醒后,线程被取消挂起。我想更改执行程序正在使用的时钟,以便即使在设备进入深度睡眠后它也能继续计数。有没有办法我可以覆盖正在使用的时钟(我意识到我可以换掉整个实现并使用警报管理器,但我希望此时不要更改现有代码,所以请不要尝试提供其他 API)。

我的问题是,尽管设备处于睡眠状态,但必须有一个系统时钟继续运行,我怎样才能让执行程序调度程序使用该时钟而不是它现在使用的时钟,它尊重设备进入深度睡眠并暂停滴答作响?

我目前拥有的代码非常简单,如下所示:

myExecutorService.schedule(new EndUserSession(),
                        6L, TimeUnit.MINUTES);

上面的这段代码在 6 分钟内启动 EndUserSession()。它可以工作,但我想使用另一个不考虑移动设备超时的时钟。

4

1 回答 1

2

我强烈怀疑是否有可能影响调度程序服务计时机制。

您还有另一种选择来避免设备睡眠引起的问题,例如在构造函数中传递特定的时间戳并以固定速率调度任务。例子:

class EndSessionTask {

    final long sessionExpirationTime;
    volatile ScheduledFuture future;

    public EndSessionTask(long ts) { sessionExpirationTime = ts; }

    public void run() {
        if (sessionExpirationTime < currentTs) return;
        endSession();
        future.cancel();
    }

    public void setFuture(ScheduledFuture f) { this.future = f; }
}

long endSessionTime = System.currentTimeMillis() + 6 * 60 * 1000;
EndSessionTask task = new EndSessionTask(endSessionTime);
ScheduledFuture future = executorService.scheduleAtFixedRate(task, 10L, 10L, SECONDS);
task.setFuture(future);
于 2016-02-27T19:29:00.523 回答