3

以下のコードに示すように、Android アプリでランナブルを使用してカウントダウン タイマーを更新しています。動作しているように見えますが、タイマーが予想より数秒長くかかることに気付きました。たとえば、3 分間カウントダウンすることになっている場合、3 分 5 秒かかります。メインアクティビティのカウントダウン表示を管理するサービスでタイマーを使ってみました。タイマー/サービスは期待どおりに機能しました。

runnable/postDelayed()が正しい時間実行されないのはなぜですか? postDelayed()タイミングは信頼できますか?はrunnable変数をデクリメントし、それを使用して with を更新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);
4

2 に答える 2

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);  
}
于 2011-03-26T11:00:51.133 に答える
1

CountDownTimer の使用についてはどうですか? これを同じタスクに数回使用しましたが、この種の問題には遭遇していません。

于 2012-06-28T09:44:25.673 に答える