如何衡量经过的时间

use*_*882 36 java android

我有一个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);
Run Code Online (Sandbox Code Playgroud)

我用这个来阻止柜台:

T.cancel();
Run Code Online (Sandbox Code Playgroud)

现在我需要两件事:

  • 一种如何计算经过时间并将其存储在变量中的方法
  • 我需要最终值为双倍,例如最终得分是:15.49秒.

poi*_*oae 73

游戏开始时:

long tStart = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

当游戏结束时:

long tEnd = System.currentTimeMillis();
long tDelta = tEnd - tStart;
double elapsedSeconds = tDelta / 1000.0;
Run Code Online (Sandbox Code Playgroud)

  • 根据[文档](http://developer.android.com/reference/android/os/SystemClock.html):`System.currentTimeMillis()是表示自纪元以来毫秒的标准"墙"时钟(时间和日期) .挂钟可以由用户或电话网络设置(请参阅setCurrentTimeMillis(long)),因此时间可能会不可预测地向后或向前跳转.因此`System.currentTimeMillis()`是实现经过时间的不良选择. (21认同)
  • 根据Android [docs](http://developer.android.com/reference/android/os/SystemClock.html),SystemClock.elapsedRealtime()是通用间隔时间的推荐基础. (19认同)
  • @Benjamin你有什么建议? (6认同)

Ben*_*min 49

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

SystemClock 文档概述了各种时间方法及其适用的用例.

  • SystemClock.elapsedRealtime()并且SystemClock.elapsedRealtimeNanos()是计算通用经过时间的最佳选择.
  • SystemClock.uptimeMillis()并且System.nanoTime()是另一种可能性,但与推荐的方法不同,它们不包括深度睡眠的时间.如果这是你想要的行为,那么他们可以使用.否则坚持下去elapsedRealtime().
  • 远离,System.currentTimeMillis()因为这将返回"墙"时钟时间.由于挂钟时间可能向前或向后跳跃,因此不适合计算经过时间.像NTP客户端这样的很多东西都会导致挂钟时间跳跃和歪斜.这将导致基于时间的计算currentTimeMillis()并不总是准确的.

游戏开始时:

long startTime = SystemClock.elapsedRealtime();
Run Code Online (Sandbox Code Playgroud)

当游戏结束时:

long endTime = SystemClock.elapsedRealtime();
long elapsedMilliSeconds = endTime - startTime;
double elapsedSeconds = elapsedMilliSeconds / 1000.0;
Run Code Online (Sandbox Code Playgroud)

此外,Timer()是尽力而为计时器,并不总是准确的.因此在游戏持续时间内会有累积的计时错误.为了更准确地显示临时时间,请使用定期检查System.currentTimeMillis()作为发送时间的基础setText(...).

此外,Timer您可能希望查看使用,而不是使用TimerTask,此类是为您要执行的操作而设计的.唯一的问题是它倒计时而不是向上,但这可以通过简单的减法来解决.


小智 11

更好!

long tStart = System.nanoTime();
long tEnd = System.nanoTime();
long tRes = tEnd - tStart; // time in nanoseconds
Run Code Online (Sandbox Code Playgroud)

阅读有关nanoTime()的文档!