2011-10-07 26 views
5

我需要測量一段時間,可以持續幾個小時。我假設正常的方式來做到這一點會是這樣的:如何避免Android遊戲中的時鐘漏洞?

Date date = new Date(); 
...wait some time... 
(new Date()).getTime() - date.getTime()) 

,但可以更改用戶的Android的時鐘撥回一小時,騙取遊戲,使時間跨度更短?從在線來源閱讀時間是否是最佳解決方案?

回答

9

new Date()使用System.currentTimeMillis()這取決於操作系統時鐘 - 並且可能隨用戶更改系統日期和時間而改變。

您應該使用System.nanoTime(),這具有以下特點:

/** 
* Returns the current value of the most precise available system 
* timer, in nanoseconds. 
* 
* <p>This method can only be used to measure elapsed time and is 
* not related to any other notion of system or wall-clock time. 
* The value returned represents nanoseconds since some fixed but 
* arbitrary time (perhaps in the future, so values may be 
* negative). This method provides nanosecond precision, but not 
* necessarily nanosecond accuracy. No guarantees are made about 
* how frequently values change. Differences in successive calls 
* that span greater than approximately 292 years (2<sup>63</sup> 
* nanoseconds) will not accurately compute elapsed time due to 
* numerical overflow. 
* 
* <p> For example, to measure how long some code takes to execute: 
* <pre> 
* long startTime = System.nanoTime(); 
* // ... the code being measured ... 
* long estimatedTime = System.nanoTime() - startTime; 
* </pre> 
* 
* @return The current value of the system timer, in nanoseconds. 
* @since 1.5 
*/ 
public static native long nanoTime(); 

這不能僅通過更改系統日期進行操作。

+0

完美,謝謝。 – FoppyOmega

+1

任何人都知道iOS SDK的等價物? – Tocco

+0

一個缺點是,當CPU被重置時nanoTime將被重置。這意味着您無法測量手​​機關機時的精確時間。 – sjkm