2016-02-09 141 views
0

我想查看用户是否在一秒内完成了某个任务。我知道有几种方法可以让时间流逝,但我想知道这种情况下最准确的方法。我想从某个时间开始计算时间。例如,注册一个计时器,后来重提它:精确倒计时?

  1. 用户做一些事情

  2. 我检查,如果用户在一秒定时器

  3. 用户再次做了

    完成的任务
  4. 我检查用户是否完成了以前运行的同一秒钟定时器内的任务。如果没有,则使计时器为空。

  5. 用户做重复的事情

  6. 我检查用户是否完成了一次秒计时器内完成这项任务。如果没有,则使计时器为空。

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

回答

0

使用System.currentTimeMillis()System.nanoTime(),如果您需要纳秒精度。我想,System.currentTimeMillis()精度应该足够你的情况。

在开始任务之前记录时间戳,然后在完成任务和任务之后立即记录一个时间戳。

检查this answer说明哪种方法更适合您。

+0

我已经尝试过,但我的问题是,我正在做一个在一个单独的类中的侦听器中的所有这一切。每当它再次开始监听时,我之前记录的时间戳变量都会被擦除,而当我尝试使用它时,我会得到空值。如何防止这个变量(双)失去其数据? –

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"); 

} 
+0

我已经尝试过,但我的问题是,我正在这个时间记录在一个单独的类中的侦听器中。每当它再次开始监听时,我之前记录的时间戳变量都会被擦除,而当我尝试使用它时,我会得到空值。如何防止这个变量(双)失去其数据? –

+0

不知道代码有点难说。 也许你可以检查它是否已经记录了时间? – MartinS

+0

是的,那会很好。我如何检查? –