我有一个10和20的问题游戏。我需要计算用户完成游戏后经过的时间。
Timer T=new Timer();
T.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable()
{
public void run()
{
countdown.setText(""+count);
count++;
}
});
}
}, 1000, 1000);
我用这个来阻止柜台:
T.cancel();
现在我需要两件事:
游戏开始时:
long tStart = System.currentTimeMillis();
当游戏结束时:
long tEnd = System.currentTimeMillis();
long tDelta = tEnd - tStart;
double elapsedSeconds = tDelta / 1000.0;
根据Android docs SystemClock.elapsedRealtime()
是通用间隔时间的推荐基础。这是因为,根据文档,elapsedRealtime()is guaranteed to be monotonic, [...], so is the recommend basis for general purpose interval timing.
SystemClock documentation对各种时间方法及其适用的用例有一个很好的概述。
SystemClock.elapsedRealtime()
和SystemClock.elapsedRealtimeNanos()
是计算一般用途经过时间的最佳选择。SystemClock.uptimeMillis()
和System.nanoTime()
是另一种可能性,但与推荐的方法不同,它们不包括深度睡眠的时间。如果这是你想要的行为,那么他们可以使用。否则坚持使用elapsedRealtime()
。System.currentTimeMillis()
,因为这将返回“墙”时钟时间。由于挂钟时间可能向前或向后跳跃,因此不适合计算经过时间。像NTP客户端这样的很多东西都会导致挂钟时间跳跃和歪斜。这将导致基于currentTimeMillis()
的经过时间计算并不总是准确的。游戏开始时:
long startTime = SystemClock.elapsedRealtime();
当游戏结束时:
long endTime = SystemClock.elapsedRealtime();
long elapsedMilliSeconds = endTime - startTime;
double elapsedSeconds = elapsedMilliSeconds / 1000.0;
此外,Timer()是尽力而为计时器,并不总是准确的。因此在游戏持续时间内会有累积的计时错误。为了更准确地显示临时时间,请使用定期检查System.currentTimeMillis()
作为发送到setText(...)
的时间的基础。
此外,您可能希望使用Timer
而不是使用TimerTask
,这个类是为您想要做的而设计的。唯一的问题是它倒计时而不是向上,但这可以通过简单的减法来解决。
更好!
long tStart = System.nanoTime();
long tEnd = System.nanoTime();
long tRes = tEnd - tStart; // time in nanoseconds
阅读有关nanoTime()的documentation!