2

我目前正在使用 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() 很浪费?

4

1 回答 1

4

这是我的做法:

1) 将任务安排为单次执行而不是重复执行

2)在执行结束时(可能在finally块中),安排新的单次执行任务,延迟时间更长。请注意,您必须创建任务的新实例,否则计时器会报错(IllegalStateException)。这意味着您不能再使用匿名内部类了。

于 2010-05-26T11:23:48.110 回答