当设备处于低功耗模式时,SystemClock.elapsedRealtime()会漂移

时间:2012-06-27 17:14:22

标签: android

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

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

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

2 个答案:

答案 0 :(得分:2)

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

我知道谷歌不建议使用currentTimeMillis进行计时,但似乎在应用程序失去焦点时保持正确的时间会更好。

答案 1 :(得分:1)

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

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

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