2012-06-27 42 views
4

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

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

这是正常的吗?这是Android中的错误吗?有什么办法通过睡眠/唤醒周期来保持约20毫秒的定时精度?

回答

1

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

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

+0

感谢,似乎你是对的,使用currentTimeMillis()工作有点比elapsedRealtime()在漂移方面更好(它仍然似乎漂移了一下,虽然) –

0

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

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

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

相关问题