1

我需要秒表,我使用了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 类可以按预期通过此测试?

谢谢你。

4

2 回答 2

5

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

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

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

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

long startTime = System.nanoTime(); 

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

long estimatedTime = System.nanoTime() - startTime;
于 2012-12-02T22:48:27.470 回答
0

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

于 2012-12-02T22:50:19.893 回答