2016-03-03 140 views
0

我有一個倒數計時器對象。基本上計時器應該從10倒數到1.它的作用是從9開始計時,並且它在1結束,但它在1上停留約2秒......爲什麼會發生這種情況。我確定我的計時器不會重疊/連續兩次被調用,因爲這可能是原因。這是我的計時器對象的一部分。倒數計時器應該從第二秒開始

new CountDownTimer(10000, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      Log.d("timer","Actual: " + Long.toString(millisUntilFinished)+".... "+Long.toString(millisUntilFinished/1000)); 
      time.setText(Long.toString(millisUntilFinished/1000)); 
     } 

這就是我從Log.d輸出獲得:

03-03 21:23:15.438 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 9964.... 9 
03-03 21:23:16.453 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 8949.... 8 
03-03 21:23:17.463 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 7939.... 7 
03-03 21:23:18.473 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 6929.... 6 
03-03 21:23:19.482 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 5919.... 5 
03-03 21:23:20.493 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 4909.... 4 
03-03 21:23:21.503 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 3899.... 3 
03-03 21:23:22.513 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 2889.... 2 
03-03 21:23:23.523 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 1879.... 1 
03-03 21:23:25.436 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 9978.... 9 
03-03 21:23:26.453 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 8961.... 8 
03-03 21:23:27.463 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 7951.... 7 
03-03 21:23:28.473 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 6941.... 6 
03-03 21:23:29.483 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 5931.... 5 
03-03 21:23:30.493 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 4921.... 4 
03-03 21:23:31.503 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 3911.... 3 
03-03 21:23:32.514 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 2900.... 2 
03-03 21:23:33.522 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 1891.... 1 
03-03 21:23:35.431 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 9994.... 9 
03-03 21:23:36.443 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 8982.... 8 
03-03 21:23:37.454 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 7971.... 7 
03-03 21:23:38.463 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 6961.... 6 
03-03 21:23:39.474 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 5951.... 5 
03-03 21:23:40.493 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 4932.... 4 
03-03 21:23:41.503 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 3922.... 3 
03-03 21:23:42.513 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 2912.... 2 
03-03 21:23:43.523 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 1902.... 1 
03-03 21:23:45.456 1947-1947/com.w1481217.braintraninggame D/timer: Actual: 9978.... 9 

回答

1

看來,蜱不作爲,在預期可能完全精確的時間間隔進來了。在你的情況下,millisUntilFinished連續onTick回調的值不能保證爲10000,9000,...,0.

第一個tick沒有9秒(或9000ms)剩餘,它有9964ms 。因此,從您撥打CountDownTimer時的start()到此第一次打勾回調時間,只有36ms過去了。克里斯對他的回答評論說「第一次回調發生在1000毫秒後」似乎是不正確的(我會對他的回答發表評論,但我沒有代表!)。由於經典的整數除法問題,您在文本視圖和日誌語句中看到了9。您沒有看到額外的0.964秒,因爲除法結果是long,它沒有小數部分。嘗試使用1000.0作爲日誌語句中的除數,並刪除Long.toString()並查看顯示的值。

在問候掛朝倒計時結束時,看到以下內容:https://stackoverflow.com/a/12283400/1244019

取決於你如何精確想你的計時器,也許是你的問題的解決方案將是保持你的CountDownTimer內的計數器,更新你的TextView並每次遞減計數器onTick被調用。見下面:

new CountDownTimer(11500, 1000) { 
    int i = 10; 
    @Override 
    public void onTick(long millisUntilFinished) { 
     Log.d("timer","Time left: " + i); 
     // Update TextView 
     i--; 
    } 

    @Override 
    public void onFinish() { } 
}.start(); 
+0

是的,我想知道克里斯的評論同樣的事情。無論如何,我試圖劃分時間,但沒有用。我想讓計時器從11000ms開始到1000ms是合理的,因爲如果我將時間除以1000,實際上確實從10開始計時。並且總時間仍然是10秒。雖然......雖然看起來像是一個枯燥的東西......但是它卻弄錯了這個錯誤! –

+0

哦,你說得很對。我會收回我的廢話。 –