根据API文档以及之前的SO threads,即使设备处于休眠状态,SystemClock.elapsedRealtime()
也应该保持准确的时间。这不是我观察到的。
我写了一个简单的时钟,它位于while (true)
循环中,并根据SystemClock.elapsedRealtime()
的值更新屏幕上的时间。如果我同步两个设备上的时钟,例如通过NTP,然后在其中一个设备上开启和关闭屏幕几次,显示的时间将漂移最多+/- 0.7秒。 (这仅在手机未连接外部电源时发生,因此睡眠模式可能是此处的罪魁祸首)。
这是正常的吗?这是Android中的错误吗?有没有办法在睡眠/唤醒周期内保持~20毫秒的定时精度?
答案 0 :(得分:2)
我一直有同样的问题,所以今晚我尝试将我的计时方法从SystemClock.elapsedRealtime()
更改为System.currentTimeMillis()
。到现在为止还挺好。当我点击应用程序并返回时,时间不会漂移
我已在服务中使用Runnable对其进行了测试。我目前正在主活动中使用Runnable进行测试,并在应用程序失去焦点时使用sharedprefs存储所有内容。
我还没有确定这两种方法中哪一种最好 - 但currentTimeMillis
似乎没有受到漂移时间问题elapsedRealtime
的影响。
我知道谷歌不建议使用currentTimeMillis
进行计时,但似乎在应用程序失去焦点时保持正确的时间会更好。
答案 1 :(得分:1)
我有一个应用程序,每分钟与服务器通信一次。它通过在启动时记录服务器时间和SystemClock.elapsedRealtime()来同步设备时钟和服务器时钟,然后使用elapsedRealtime计算服务器时间(我这样做是因为设备本身从网络同步时间而且####不能完全信任。
在一周时间内,在Galaxy Tab 2上运行,SystemClock.elapsedRealtime()在两小时下仅落后服务器时钟几分钟。我的日志显示漂移的速度不是恒定的,所以设备的使用方式确实会影响它。
虽然API要求时钟提供单调时间,但它并不能保证准确性。因此,在长时间内准确记录时间并不是一种有用的方法。