Java 当系统时间更改时,运行计时器会发生什么情况?

Java 当系统时间更改时,运行计时器会发生什么情况?,java,android,Java,Android,当系统时间更改时,运行计时器会发生什么情况 我有一个android应用程序,我使用handler.postDelayed(Runnable,interval)来发布一个Runnable,以便在间隔结束时调用(run()方法) 我的问题是: 如果基础系统时间在外部更改,会发生什么情况? 我的印象是,张贴仍然发生,但在系统时间的变化倒计时再次开始。。。有人能在这里遮光吗 如果时间改变是向前还是向后,行为会改变吗 不,没关系。如果仔细研究代码,延迟由以下机制提供- SystemClock.uptime

当系统时间更改时,运行计时器会发生什么情况

我有一个android应用程序,我使用handler.postDelayed(Runnable,interval)来发布一个Runnable,以便在间隔结束时调用(run()方法)

我的问题是: 如果基础系统时间在外部更改,会发生什么情况? 我的印象是,张贴仍然发生,但在系统时间的变化倒计时再次开始。。。有人能在这里遮光吗


如果时间改变是向前还是向后,行为会改变吗

不,没关系。如果仔细研究代码,延迟由以下机制提供-

SystemClock.uptimeMillis() + delayMillis

所以这纯粹是相对的。而且系统时间的改变对其没有影响

首先,您应该知道
处理程序
基于
SystemClock.uptimeMillis()
Handler
s sendMessageXXX()方法,如
sendMessageDelayed
sendEmptyMessage
都使用以下方法:

//calcute the milliseconds we hope to handle the message since the system was booted
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)
然后,时间间隔值
SystemClock.uptimeMillis()+delayMillis
将在
时保存在
消息的
字段中,我们将消息放入
消息队列
等待
Looper
轮询出来

当活套从队列中获取下一条消息时,它将比较
SystemClock.uptimeMillis()
msg。当
时,判断消息是否准备就绪。如果下一条消息未准备就绪,它将设置一个超时来唤醒,直到消息准备就绪

其次,您将
SystemClock.uptimeMillis()
System.currentTimeMillis()
混淆。下面是文档的一部分,解释了这两个概念:

  • SystemClock.uptimeMillis()
    自系统启动以来以毫秒计。当系统进入深度睡眠(CPU关闭、显示器变暗、设备等待外部输入)时,该时钟停止,但不受时钟缩放、空闲或其他节能机制的影响。这是大多数间隔计时的基础,例如Thread.sleep(mills)、Object.wait(mills)和System.nanoTime()。该时钟保证是单调的,并且适合在间隔不跨越设备睡眠时进行间隔定时
  • System.currentTimeMillis()
    是标准的“墙上”时钟(时间和日期),表示从纪元开始的毫秒数。挂钟可以由用户或电话网络设置(请参阅setCurrentTimeMillis(long)),因此时间可能会不可预测地向后或向前跳跃。只有当与真实世界的日期和时间的通信非常重要时,才应使用此时钟,例如在日历或闹钟应用程序中。间隔或经过时间测量应使用不同的时钟。如果使用Surviv.TrimeTimeMILISH(),请考虑收听ActhOnTimeTyTimk,ActhOnTimeTyLochange和ActoNoTimeZONYY更改意图广播,以查明时间改变的时间。

你为什么不试试呢?为了确保在阅读了真实答案后,我做了测试。在我的特定场景中,为这个特定的案例设置测试并不容易,我问了一个问题。在阅读了“真实的”答案后,我认为值得花时间来测试它,迪布兹马尼亚和宝阳都是正确的,我欣赏宝阳答案的完整性。我测试了系统时间前后移动的情况,处理程序一致地忽略了更改。