如何测量stream逝的时间

我有一个10和20个问题的游戏。 我需要计算用户完成游戏后需要花费多less时间。

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(); 

现在我需要两件事情:

  • 如何计算经过的时间并将其存储在variables中
  • 我需要最终的价值是一个双重的,例如最后的分数是:15.49秒。

游戏开始时:

 long tStart = System.currentTimeMillis(); 

游戏结束时:

 long tEnd = System.currentTimeMillis(); long tDelta = tEnd - tStart; double elapsedSeconds = tDelta / 1000.0; 

根据Android 文档 SystemClock.elapsedRealtime()是通用间隔时间的推荐基础。 这是因为,根据文档,elapsedRealtime() is guaranteed to be monotonic, [...], so is the recommend basis for general purpose interval timing.

SystemClock 文档对各种时间方法及其适用的用例有一个很好的概述。

  • SystemClock.elapsedRealtime()SystemClock.elapsedRealtimeNanos()是计算通用用途时间的最佳select。
  • 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 ,这个类是专为你想要做的。 唯一的问题是它倒数而不是up,但是这可以用简单的减法来解决。

更好!

 long tStart = System.nanoTime(); long tEnd = System.nanoTime(); long tRes = tEnd - tStart; // time in nanoseconds 

阅读有关nanoTime()的文档 !