如何衡量经过的时间

问题描述 投票:35回答:3

我有一个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();

现在我需要两件事:

  • 一种如何计算经过时间并将其存储在变量中的方法
  • 我需要最终值为双倍,例如最终得分是:15.49秒。
java android
3个回答
73
投票

游戏开始时:

long tStart = System.currentTimeMillis();

当游戏结束时:

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

48
投票

根据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,这个类是为您想要做的而设计的。唯一的问题是它倒计时而不是向上,但这可以通过简单的减法来解决。


9
投票

更好!

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

阅读有关nanoTime()的documentation

© www.soinside.com 2019 - 2024. All rights reserved.