4

我正在尝试实现一个计时器,它可以用于短(秒)事件或更长(小时等)事件。

理想情况下,它应该在 CPU 关闭时持续存在,例如,电池没电了。如果我使用 System.currentTimeMillis() 设置开始时间并使用相同的函数设置结束时间,它几乎适用于所有情况,除了在闰秒、闰年、夏令时更改等期间......或者,如果用户只是更改时间(我已经验证了这一点)。这是在Android系统上,顺便说一句。

相反,如果我使用 System.nanoTime(),除了可能更准确之外,它不会出现时间变化等常见的“困难时间”问题。我的问题是,System.nanoTime() 是否测量纳秒某个任意时间,在“困难时期”?我不确定正确的术语是什么,但例如,System.nanoTime() 会在 X 处运行,然后 X+1 小时后,系统关闭(例如,Android 设备上的电池没电了),然后是 X +10 小时,系统启动,此时运行 System.nanoTime() 会返回 10 小时吗?或者它会返回 1 小时(因为当系统关闭/休眠时 nanoTime 使用的“计数器”可能不会运行?)。

4

2 回答 2

2

android.os.SystemClock.elapsedRealtime() - 自系统启动以来的毫秒数,包括处于睡眠状态的时间。这应该是你最好的选择。

我认为您无法测量android中的关闭时间。

有关更多信息,最好查看 android 系统时钟页面。http://developer.android.com/reference/android/os/SystemClock.html

于 2012-06-18T22:30:55.247 回答
1

是未定义的

“返回的值表示自某个固定但任意的原始时间以来的纳秒(可能在将来,因此值可能为负数)。Java 虚拟机实例中此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。”

为简单起见,我们会说当您在时间 X 运行它时,原点是 X(这是允许的)。这意味着它将返回 0,然后在 VM 实例中,时间将以与正常时钟相同的速率流逝。

当您使用Thread.sleep时,这不会更改 VM 实例,因此不会对其进行特殊处理。

但是,在设备重新启动后,您将处于不同的 VM 实例中。因此,不再保证 X 是原点。

于 2012-06-18T22:14:19.850 回答