2016-02-09 64 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

是的,那會很好。我如何檢查? –