Инкрементный таймер - PullRequest
2 голосов
/ 26 мая 2010

В настоящее время я использую Timer и TimerTask для выполнения некоторой работы каждые 30 секунд.

Моя проблема в том, что после каждого выполнения этой работы я хочу увеличивать интервал времени Таймера.

Так, например, он запускается с 30 секундами между срабатыванием таймера, но я хочу добавить 10 секунд к интервалу, чтобы в следующий раз таймер занимал 40 секунд до его срабатывания.

Вот мой предыдущий код:


  public void StartScanning() {

    scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {

                            wifiManager.startScan();
                            scanCount++;            
                            if(SCAN_INTERVAL_TIME <= SCAN_MAX_INTERVAL){

                                SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;
                                t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);
                            }

                        }
               });
        }};
        Log.d("SCAN_INTERVAL_TIME ** ", "SCAN_INTERVAL_TIME ** = " + SCAN_INTERVAL_TIME);
        t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);

}

РЕФАКТОРНЫЙ КОД


@Override
public void StartScanning() {

        t.schedule(new ScanTask(),SCAN_INTERVAL_TIME);

}

class ScanTask extends TimerTask{

    @Override
    public void run() {
        wifiManager.startScan();
        scanCount++;   

        if(SCAN_INTERVAL_TIME < SCAN_MAX_INTERVAL)
        SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;

        t.schedule(new ScanTask(), SCAN_INTERVAL_TIME);
    }


}

Теперь это работает, но каждый раз создание нового ScanTask () бесполезно?

1 Ответ

4 голосов
/ 26 мая 2010

Вот как бы я это сделал:

1) Запланируйте задачу для одиночного выполнения, а не повторного

2) В конце выполнения (возможно, в блоке finally) запланируйте новое одиночное выполнение задачи с более длительной задержкой. Обратите внимание, что вы должны создать новый экземпляр задачи, иначе таймер будет жаловаться (IllegalStateException). Это означает, что вы больше не можете использовать анонимный внутренний класс.

...