gpt4 book ai didi

java - 当系统时间改变时运行的定时器会发生什么?

转载 作者:搜寻专家 更新时间:2023-11-01 09:37:50 29 4
gpt4 key购买 nike

当系统时间改变时运行的定时器会发生什么?

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

我的问题是:如果从外部更改了底层系统时间会怎样?我的印象是发布仍然发生,但在系统时间更改时倒计时再次开始......有人可以在这里遮光吗?

如果时间向前或向后变化,行为会改变吗?

最佳答案

首先,您应该知道Handler 是基于SystemClock.uptimeMillis() 的。Handler的sendMessageXXX()方法,如sendMessageDelayedsendEmptyMessage内部都使用了下面的方法:

//calcute the milliseconds we hope to handle the message since the system was booted
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)

然后,时间间隔值 SystemClock.uptimeMillis() + delayMillis 将保存到 Message 的字段 when 中,我们将消息进入 MessageQueue 等待 Looper 轮询它。

当looper从队列中获取下一条消息时,它会比较SystemClock.uptimeMillis()msg.when来判断消息是否就绪。如果下一条消息还没有准备好,它会设置超时唤醒,直到消息准备好。

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

  • SystemClock.uptimeMillis() 自系统启动后以毫秒计算。该时钟在系统进入深度 sleep (CPU 关闭、显示器变暗、设备等待外部输入)时停止,但不受时钟缩放、空闲或其他节能机制的影响。这是大多数间隔计时的基础,例如 Thread.sleep(millls)、Object.wait(millis) 和 System.nanoTime()。此时钟保证是单调的,适用于间隔不跨越设备 sleep 的间隔计时。
  • System.currentTimeMillis() 是标准的“挂钟”(时间和日期),表示自纪元以来的毫秒数。挂钟可以由用户或电话网络设置(请参阅 setCurrentTimeMillis(long)),因此时间可能会不可预测地向后或向前跳跃。只有在与现实世界的日期和时间对应很重要时才应使用此时钟,例如在日历或闹钟应用程序中。间隔或耗时测量应使用不同的时钟。如果您正在使用 System.currentTimeMillis(),请考虑收听 ACTION_TIME_TICK、ACTION_TIME_CHANGED 和 ACTION_TIMEZONE_CHANGED Intent 广播以了解时间何时更改。

关于java - 当系统时间改变时运行的定时器会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41754658/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com