我需要使用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中看到每秒的时间值,这是结果:
实时是最长+ 5毫秒,但在列中它至少是+3秒!这怎么可能?
是一样的new Date().getTime().
是否有一些StopWatch类会按预期通过此测试?
谢谢。
答案 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吗?