2011-12-06 125 views
1

我有一個場景,我需要以特定的時間間隔運行某個任務,但是,我希望能夠重置/重新啓動計時器而不需要重新實例化。這是我的代碼,以便更好地理解。Android的java.util.Timer與重置選項

private TimerTask beatTask = new TimerTask() { 
     @Override 
     public void run() { 
      beatDetected(); 
     } 
    }; 

public void beatDetected() { 
     timeoutTimer.cancel(); 

     // handle my stuff and restart the timer. 

     timeoutTimer.schedule(beatTask, 2000); 
    } 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

     (timeoutTimer = new Timer()).schedule(beatTask, 2000); 

     return Service.START_STICKY; 
    } 

本實施背後的想法是,beatDetected()可以從外部事件調用,在這種情況下,一個時鐘嘀噠應該從即經過時間的下一個任務應該是復位那一刻發生。不過,我只能得到第一個滴答聲,從那時起,計時器就不起作用了。 我不限於使用Timer類,任何解決上述情況的方法都可以工作。我想知道如何使用postDelayed,但是這個代碼位於一個Service中,並且我不需要UI線程感知的更新。

回答

9

對Android設備使用單獨的線程進行定時器被認爲是一種有點不好的做法。這是因爲在大多數情況下你會浪費資源。

如果您不需要超精確的時間事件,您應該使用基於Handler的定時器。這種計時器的例子可以在這裏看到:Repeat a task with a time delay?。這種方法適用於活動和服務。

另請注意,如果設備進入睡眠模式,基於定時器的HandlerTimer將被暫停。如果這不是您需要的,請使用AlarmManager(但請記住,錯誤地使用AlarmManager可能會導致電池性能很差)。


正在重置的Handler基於定時器:

void resetRepeatingTask() { 
    mHandler.removeCallbacks(mBeatDetector); 
    mHandler.postDelayed(mBeatDetector, mInterval);   
} 
+0

我已經看過Handler和AlarmManager。考慮到我的任務每2秒重複一次,AlarmManager不是最佳選擇。本質上Handler和Timer會做同樣的事情。然而,我的問題是能夠在定時器/處理程序運行時重置「下一個打勾」。 –

+0

Yeap,AlarmManager對此太「沉重」了。重置'Handler'只需再次調用'Handler.removeCallbacks()'而不是'Handler.postDelayed()'。這將重啓延遲。 – inazaruk

+0

用「重置計時器」示例更新了答案。 – inazaruk

2

接受的答案不工作(至少對於我來說)。

一個簡單的解決方案使用Timer觸發TimerTask,它可以很容易地重置。

Log.d(TAG, "Restarting timer"); 
if (timer != null) { 
    timer.cancel(); 
} 
timer = new Timer(); 
timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     Log.d(TAG, "Run the task"); 
    } 
}, 1000); 

注意,新TimerTask必須創建每次復位定時器時間 - 你不能重複使用舊的。如果你想保持狀態,你需要獲得計時器任務來運行一個單獨的任務。

+0

感謝它爲我工作 –