簡體   English   中英

帶有重置選項的Android java.util.Timer

[英]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的計時器。 這樣的計時器的示例可以在這里看到: 重復執行某個任務有時間延遲嗎? 此方法適用於活動和服務。

也請記住,這兩個HandlerTimer ,如果設備進入休眠模式定時器基礎將暫停。 如果這不是您需要的,請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM