2012-06-27 68 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要求時鐘提供單調時間,但並不能保證準確性。因此,長時間準確記錄時間並不是一種有用的方法。

相關問題