System.currentTimeMillis()工作错误

时间:2012-12-02 22:34:15

标签: android time stopwatch

我需要使用stopWatch并使用http://www.goldb.org/stopwatchjava.html

它运行不正常,所以我尝试每1000ms写出一次值:

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中看到每秒的时间值,这是结果:

enter image description here

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

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

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

谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

可以非常精确地测量经过的时间。来自它的javadoc:

long startTime = System.nanoTime(); 

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

long estimatedTime = System.nanoTime() - startTime;

答案 1 :(得分:0)

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