5

根据 API 文档以及之前的SO 线程SystemClock.elapsedRealtime()即使设备处于睡眠状态,也应该保持准确的时间。这不是我观察到的。

我编写了一个简单的时钟,它位于一个while (true)循环中,并根据 的值更新屏幕上的时间SystemClock.elapsedRealtime()。如果我在两个设备上同步时钟,例如通过 NTP,然后在其中一个设备上打开和关闭屏幕几次,显示的时间将漂移最多 +/- 0.7 秒。(这仅在手机未连接到外部电源时发生,因此睡眠模式可能是这里的罪魁祸首)。

这是正常的吗?这是Android中的错误吗?有没有办法在睡眠/唤醒周期中保持约 20 毫秒的计时精度?

4

2 回答 2

2

我一直有同样的问题,所以今晚我尝试将我的计时方法从 更改SystemClock.elapsedRealtime()System.currentTimeMillis()。到目前为止,一切都很好。当我点击关闭应用程序并返回时,时间并没有漂移。
我已经在服务中使用 Runnable 对其进行了测试。我目前正在主要活动中使用 Runnable 对其进行测试,并在应用程序失去焦点时使用 sharedprefs 来存储所有内容。我还没有决定这两种方法中哪一种最好——但currentTimeMillis似乎不受漂移时间问题的影响elapsedRealtime

我知道谷歌不建议将currentTimeMillis其用于计时目的,但似乎在应用程序失去焦点时保持正确时间效果更好。

于 2012-07-26T23:16:41.037 回答
2

我有一个每分钟与服务器通信一次的应用程序。它通过在启动时记录服务器时间和 SystemClock.elapsedRealtime() 然后使用 elapsedRealtime 计算服务器时间来同步设备时钟和服务器时钟(我这样做是因为设备本身从网络同步时间而 #### 不能完全值得信赖)。

在 Galaxy Tab 2 上运行的一周期间,SystemClock.elapsedRealtime() 在两小时内仅落后于服务器时钟几分钟。我的日志显示漂移的速度不是恒定的,因此设备的使用方式确实会影响它。

虽然 API 要求时钟提供单调的时间,但它并不能保证准确性。因此,它不是长时间准确记录时间的有用方法。

于 2015-11-24T07:28:23.937 回答