java - 计时器在 Java 中意外触发

标签 java android

我已经启动了固定速率的计时器。当用户更改系统时间时,任务将连续执行。它不考虑周期时间。如何管理。

timer.scheduleAtFixedRate(task, delay, period);

注意:现在系统时间为当前时间,周期为30秒。现在用户将系统时间更改为从当前时间开始 10 分钟后。此时计时器任务不考虑该时间段。在一秒钟内它执行任务 20 次。

当我使用

 timer.schedule(task, delay, period);

代替

timer.scheduleAtFixedRate(task, delay, period);

任务正常。如果我将系统时间更改为过去 10 分钟,从现在开始任务不会执行...

如何解决? :(

最佳答案

看看this堆栈溢出答案;长话短说,使用scheduleAtFixedRate将您安排的任务排队,并根据任务首次排队的系统时间触发它们;如果有任何事情应该延迟这些任务的开火,他们会玩“ catch ”并尽可能快地开火。因此,在您将系统时间更改为 +10 分钟如何使事件触发 20 次的示例中,假设您的周期为 30 秒(1m/2 = 30s,10m*2 = 20 个事件)。

使用 schedule 函数也有类似的问题,只是它不播放“catch up”;如果你有一个定时器设置为每 30 秒触发一次,然后在定时器启动后仅 10 秒将系统时间更改为 +10 分钟,你的第一个事件将触发,然后继续等待 30 秒延迟并再次触发(除非您再次更改系统时钟)。

如果您想要独立于系统时间的东西,您将需要单调的时钟值。据我所知,Java API 不直接包含任何单调计时器(出于多种原因),但这并不能阻止您自己实现一个计时器(尽管以自定义计时器类代码中可能浪费的执行时间为代价)。 Here's a Stack Overflow关于这个的问题,以及一个Google Group关于它的讨论帖。

如果您真的很难使用单调计时器,您可以使用 POSIX API's并做一些 Java->C JNI 工作。

我希望这能有所帮助(至少指向一个可靠的方向)。

关于java - 计时器在 Java 中意外触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22979641/

相关文章:

Android:相机预览旋转

android - 无法从 View 转换为 EditTextPreference

java - 使用 Objects.hash() 还是自己的 hashCode() 实现?

java - 我找不到 java.lang.isolate.Isolate

java - 从文本文件中解析数字

android - SQLite数据库上的Flutter Background操作

android - 从广播接收器调用 Activity 方法

Android AnimationDrawable,为什么总是拍两次?

java - 如何使用selenium选择页面的一部分?

java - 我应该在哪个 android SDK API 中开发应用程序,以便它适用于所有版本的 android?