【问题标题】:System.currentTimeMillis() work wrongSystem.currentTimeMillis() 工作错误
【发布时间】:2012-12-02 22:34:14
【问题描述】:

我需要秒表,我使用了http://www.goldb.org/stopwatchjava.html

效果不好,所以我尝试每 1000 毫秒写出一次值:

stopWatch.start();
HandlerScrollBar.postDelayed(TtScroll,  1000);

private Runnable TtScroll = new Runnable() {
    public void run() {
        long time = stopWatch.getElapsedTime();
        HandlerScrollBar.postDelayed(TtScroll,(long) 1000);
        Log.d(TAG, Long.toString(time));            
    }
};

我可以在 CatLog 中看到每一秒的时间值,这是结果:

实时时间最长为 +5 毫秒,但在列中至少为 +3 秒!这怎么可能?

也是一样
new Date().getTime().

是否有一些 StopWatch 类可以按预期通过此测试?

谢谢。

【问题讨论】:

    标签: android time stopwatch


    【解决方案1】:

    如果您正在测量经过的时间,并且希望它是正确的,则必须使用System.nanoTime()。你不能使用System.currentTimeMillis(),除非你不介意你的结果是错误的。

    nanoTime 的目的是测量经过的时间,currentTimeMillis 的目的是测量挂钟时间。您不能将其中一个用于其他目的。原因是没有计算机的时钟是完美的。它总是漂移,偶尔需要纠正。

    由于 nanoTime 的目的是测量经过的时间,它不受任何这些小修正的影响。我建议选择 nanoTime(),因为它在这些微计算中具有更好的准确性。

    用于极其精确地测量经过的时间。从它的javadoc:

    long startTime = System.nanoTime(); 
    

    // ... 正在测量的代码 ...

    long estimatedTime = System.nanoTime() - startTime;
    

    【讨论】:

    • 这是我累积的错误——你是对的。它工作正常,并且使用 System.nanoTime() 更加准确;
    【解决方案2】:

    似乎不可能。我从来没有让System.currentTimeMillis() 那样做。此外,您以Log.d() 的身份注销,但您显示的logcat 显示Log.e()。你确定那是正确的 logcat?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-27
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 2018-03-13
      • 2014-05-20
      • 1970-01-01
      相关资源
      最近更新 更多