【问题标题】:Incremental Timer增量定时器
【发布时间】:2011-02-24 03:13:24
【问题描述】:

我目前正在使用 Timer 和 TimerTask 每 30 秒执行一次工作。

我的问题是每次完成这项工作后,我都想增加 Timer 的间隔时间。

例如,它从计时器触发之间的 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() 很浪费?

【问题讨论】:

    标签: java android timer increment


    【解决方案1】:

    我会这样做:

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

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

    【讨论】:

    • 所以每次 Timer 触发时我都需要重新创建 scanTask 吗?
    • @Donal:根据上面的代码,您没有繁重的初始化,并且 ScanTask 类中没有数据成员。因此,每 30 秒创建一个新实例的开销应该是最小的......垃圾收集非常有效地处理短期对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多