2011-03-26 117 views
3

我在我的Android應用程序中使用可運行程序來更新倒數計時器,如下面的代碼所示。它似乎工作,但我注意到我的計時器比預期的要花幾秒鐘。例如,如果它應該倒數3分鐘,則需要3分5秒。我嘗試在服務中使用計時器來管理主要活動中的倒計時顯示。計時器/服務按預期工作。Runnable執行速度比預期慢

爲什麼不運行runnable/postDelayed()正確的時間?是postDelayed()時間可靠嗎? runnable遞減一個變量,然後使用它來更新EditTextsetText()setText()花費的時間太長(一秒鐘的一小部分),所以runnable確實每隔1.x秒運行一次?

Handler handler = new Handler(); 
Runnable r = new Runnable() { 
    public void run() { 
     // decrement the time remaining and update the display 
     handler.postDelayed(this, 1000); 
    } 
}; 
... 
// start the runnable 
handler.postDelayed(r, 1000); 
+0

如果您希望計時器準確無誤,最好從可運行內部發布消息,而不是直接更新UI。當然,理想的情況是,您應該像上面提到的那樣在服務中安裝計時器。 – rajath 2011-03-26 08:17:56

+0

我發現postDelayed發射的時間差異很大。當屏幕*關閉* 2分鐘設置會導致6 - 14分鐘的延遲。 (Android 2.2,HTC Hero) – fadedbee 2012-06-12 13:25:18

回答

2

你的代碼是有點兒八九不離十設計是不準確的,因爲你不佔由可運行的膽量所花費的時間。你可能會通過做類似

public void run(){ 
    startTime = System.currentTimeMillis(); 
    // compare expectedTime to startTime and compensate 
    // <guts of runnable goes here> 
    // now wrap it up... 
     delay = 1000 - (System.currentTimeMillis() - startTime); 
    if (delay < 0) 
     delay = 0; 
    expectedTime = System.currentTimeMillies() + delay; 
    handler.postDelayed(this, delay); 
} 
+0

我考慮過這種方法。按時完成倒計時,但延遲校正導致定時器在需要延遲校正時不顯示第二個。這種行爲是不期望的,因爲它給出了計時器不準確的外觀。 – MikeU 2011-03-30 05:36:50

+0

@MikeU是的,的確如此:這種方法偶爾會跳過一拍。你的問題的答案是:postDelayed()的時間是*不*保證 - 它只是近似值。如果您需要更高的準確性,您確實需要嘗試更復雜的方法。 – 2011-03-30 12:19:10

+0

@MikeU感謝您接受我的回答 - 讓我再考慮一下您的問題:-)我編輯了我的回答,添加了一個可能有所幫助的附加功能:您可能需要設置一個變量來保存您的時間「預計」下一次回調發生,所以你可以檢測並可能補償古怪。我認爲這是複雜性的下一步 - 可能有用但仍然可以管理。當然,您需要在構造函數中將expectedTime初始化爲0,並在第一次調用runnable時忽略此值。祝你好運。 – 2011-04-17 15:44:18

1

怎麼樣使用CountDownTimer?我多次用它來完成相同的任務,並沒有遇到這種問題。