我目前正在使用 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) 将任务安排为单次执行而不是重复执行
2) 在执行结束时(可能在 finally block 中),安排任务的新单次执行,延迟时间更长。注意你必须创建一个新的任务实例,否则定时器会报错(IllegalStateException)。这意味着您不能再使用匿名内部类。
关于java - 增量定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2912313/