准确的倒计时?

时间:2016-02-09 04:19:37

标签: java android performance oop optimization

我想看看用户是否在一秒钟内完成了某项任务。我知道有几种方法可以让时间过去,但我想知道这种情况最准确的方法是什么。我希望从某个时间开始,时间过去了。例如,注册一个计时器,稍后再参考它:

  1. 用户做某事

  2. 我检查用户是否在一秒计时器中完成了任务

  3. 用户再做一次

  4. 我检查用户是否在之前运行的同一秒计时器内完成了任务。如果没有,请将计时器设为空。

  5. 用户再做一次

  6. 我检查用户是否在一秒计时器内完成了任务。如果没有,请将计时器设为空。

  7. 我希望基本上有一个运行一秒钟的计时器,因为用户完成了各种任务。完成每项任务后,我会检查计时器是否仍在运行。我不想使用倒数计时器,因为它不够准确一秒钟。我可以使用什么方法?

2 个答案:

答案 0 :(得分:0)

如果您需要纳秒精度,请使用System.currentTimeMillis()System.nanoTime()。我想,System.currentTimeMillis()精度应该足以满足您的需求。

在开始任务之前记录时间戳,然后在完成任务并完成差异之后记录。

检查this answer,了解哪种方法更适合您。

答案 1 :(得分:0)

如果您想要最高的精确度,请使用System.nanoTime()。 System.currentTimeMillis()也应该适合你。

  

此方法提供纳秒级精度,但不一定是纳秒级分辨率(即值的变化频率) - 除了分辨率至少与currentTimeMillis()的分辨率一样好之外,不做任何保证。

只需使用这些方法之一实现一个简单的计时器。

private static final class Timer {

    private long start;
    private long end;

    static double toSeconds(long nanos) {
        return nanos / 1000000000.0;
    }

    void start() {
        end = -1;
        start = System.nanoTime();
    }

    double getCurrent() {
        return toSeconds(System.nanoTime() - start);
    }

    double stop() {
        end = System.nanoTime();
        return toSeconds(end - start); 
    }

    boolean isRunning() {
        return end == -1;
    }

}

public static void main(String[] args) {
    Timer timer = new Timer();

    timer.start();
    doSomething();
    if (timer.getCurrent() > 1.0) {
        double time = timer.stop();
        System.out.println("User completed task 1 in " + time);
    }

    doSomething();
    if (timer.isRunning() && timer.getCurrent() > 1.0) {
        double time = timer.stop();
        System.out.println("User completed task 1 & 2 in " + time);
    }

    doSomething();
    if (timer.isRunning() && timer.getCurrent() > 1.0) {
        double time = timer.stop();
        System.out.println("User completed task 1 & 2 & 3 in " + time);
    }

    System.out.println("All tasks finished");

}