Java计时,System.nanoTime()比System.currentTimeMillis()更糟糕,但它是否会在睡眠中持续存在?

时间:2012-06-18 22:09:43

标签: java android timer time-precision

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

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

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

2 个答案:

答案 0 :(得分:2)

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

我不认为你可以测量android中的关闭时间。

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

答案 1 :(得分:1)

is undefined

  

“返回的值表示纳秒,因为有些是固定的,但是   任意的起源时间(也许在未来,所以价值可能是   负)。此方法的所有调用都使用相同的原点   在Java虚拟机的实例中;其他虚拟机   实例可能使用不同的来源。“

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

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

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