2013-03-25 91 views
0

我們正在進行分佈式系統數據庫同步,它依賴於實時。android手機中的時鐘滴答

由於設備的時間可以由用戶或錯誤的網絡來改變,它可以很容易地破壞整個數據庫。所以我們決定從主服務器獲取時間,存儲它,並通過計算時鐘滴答數來計算時間間隔來計算實時。 我們如何才能訪問硬件的時鐘記號。我們將不得不爲此運行一些服務?我們希望即使設備處於待機/睡眠/關閉狀態,也可以計算滴答。就像顯示的實際時鐘一樣。 我們希望它是一種並行時鐘,只有主服務器才能在其上設置時間。

+1

如果你不信任設備時間,爲什麼不只是獲得服務器時間? 爲什麼你會在外部服務器上運行的設備上創建第二個時鐘? 並在創建的時鐘基礎同步? 只需根據您的服務器時鐘進行同步。 – Timmetje 2013-03-25 09:28:18

+0

@timmied我們正在爲偏遠地區和村莊開展此項工作,網絡一直無法使用。所以服務器時鐘在任何時候都不可用。即使在沒有連接的情況下,用戶也可以對數據庫進行編輯,以便一旦n/w可用,我們就可以使用時間值適當地表達更改。 – tMJ 2013-03-25 11:16:47

回答

3

我們怎樣才能訪問硬件的時鐘滴答。

你不知道。

我們希望即使設備處於待機/睡眠/關閉狀態,也可以計算滴答。

您的用戶沒有。您的用戶希望他們的設備正常運行,而不是讓某些軟件保持CPU開機和捆綁RAM,只是看時鐘滴答,因爲這會使電池快速耗盡。

也許你身邊的「偏遠地區和村莊」有所不同。在宇宙的大部分已知部分中,即使您的應用程序未運行,時間也會流逝。

因此,您不需要「計數滴答」來確定時間是否已過。相反,當你「從主服務器獲取時間」和「存儲它」時,存儲當前值SystemClock.elapsedRealtime(),這是自電話上次重新啓動以來的毫秒數。然後,當需要確定相對於「主服務器」的時間時,計算存儲的elapsedRealtime()值與當前elapsedRealtime()值之間的差值,並將該毫秒數添加到「主服務器的時間」以獲取當前時間,如「主服務器」所示。

+0

雖然你部分給了我答案,但解釋是可怕的。鏈接到這個http://developer.android.com/reference/android/os/SystemClock.html會更好! 在ACTION_TIME_CHANGED&ACTION_TIME_TICK上帶有顯式標記和您提到的兩種方法! 任何方式,仍然,謝謝。我將把這個問題標記爲答案! – tMJ 2013-03-29 01:48:33