[英]Android java.util.Timer with reset option
我有一個場景,需要以特定的時間間隔運行某個任務,但是,我希望能夠重置/重新啟動計時器而無需重新實例化。 這是我的代碼,可以更好地理解。
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線程感知更新。
在Android設備上,為計時器使用單獨的線程被認為是一種不好的做法。 那是因為您將在大多數情況下浪費資源。
如果不需要超精確的定時事件,則應使用基於Handler
的計時器。 這樣的計時器的示例可以在這里看到: 重復執行某個任務有時間延遲嗎? 。 此方法適用於活動和服務。
也請記住,這兩個Handler
和Timer
,如果設備進入休眠模式定時器基礎將暫停。 如果這不是您需要的,請使用AlarmManager
(但請記住,錯誤使用AlarmManager
可能會導致電池性能非常差)。
重置基於Handler
的計時器:
void resetRepeatingTask() {
mHandler.removeCallbacks(mBeatDetector);
mHandler.postDelayed(mBeatDetector, mInterval);
}
接受的答案不起作用(至少不適用於我)。
一個簡單的解決方案是使用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
您不能重用舊的計時器任務。 如果要保留狀態,則需要獲取計時器任務以運行單獨的任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.