Android 時間相關的坑

SystemcurrentTimeMillis

我們經常用這個接口來統計時間,比如

final long startTime = System.currentTimeMillis();
...
final long endTime = System.currentTimeMillis();
duration = endTime - startTime;

這端代碼正常情況下是沒有什麼問題的,但是如果是在線上,用戶量極大,且startTime和startTime的調用點不在一個地方,或者這個duration比較長時間,比如統計用戶停留耗時,這個代碼可能會收集到垃圾數據。因爲currentTimeMillis本質上和日曆時間一樣,用戶是可以修改的,比如在startTime和endTime中間用戶將日曆時間調回去了,那麼得到的duration是負值。當然對於後臺來說,可以過濾這些垃圾數據。但是爲了更好的統計時間推薦使用elapsedRealtime。

elapsedRealtime

返回的是系統從啓動到當前時間,所以這個時間做耗時duration統計是比較準確的,且不受用戶調整日期行爲影響。

timer問題

我們有時通過timer來執行一些定時任務

TimerTask timerTask = new TimerTask(){
	@Override
	public void run() {
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				System.out.println("Timer call");
			}
		});
	}
};
mTimer.schedule(timerTask,1000, 60*000);

上面代碼是正常情況下每隔60s運行一次。
但是如果用戶手工更改了本地時間,是可能導致該週期性任務失敗。這是因爲Timer本身是通過currentTimeMillis接口獲取時間的

解決方案

使用handler.postDelay這種方式。


這個uptimeMillis和elapsedRealtime類似,都是一個相對時間,用戶沒法直接修改的。

/**************************************************
* 本文來自CSDN博主"一點碼客",喜歡請頂部點擊關注
* 轉載請標明出處:http://blog.csdn.net/itchosen
***************************************************/

如需實時查看更多更新文章,請關注公衆號"一點碼客",一起探索技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章