最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Timer - Coroutines
时间:2026-06-09 09:08:54 编辑:袖梨 来源:一聚教程网
Timer → Coroutines
老写法(Java)
// 延时执行一次
new Timer().schedule(new TimerTask() {
@Override
public void run() {
doWork();
}
}, 3000);// 定时重复执行
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
fetchData();
}
}, 0, 5000);// 结束时取消
timer.cancel();
问题在哪里
Timer 用单个后台线程执行所有任务,一个 TimerTask 抛异常整个 Timer 直接挂掉,其他排队的任务全部作废。而且 Timer 不感知 Android 生命周期,忘记 cancel 会导致后台任务持续运行消耗电量。

新写法(Kotlin + Coroutines)
// 延时执行一次
viewModelScope.launch {
delay(3000)
doWork()
}// 定时重复执行
viewModelScope.launch {
while (isActive) {
fetchData()
delay(5000)
}
}// 需要精确固定间隔(类似 scheduleAtFixedRate)
viewModelScope.launch {
var nextTime = System.currentTimeMillis()
while (isActive) {
fetchData()
nextTime += 5000
val delayTime = nextTime - System.currentTimeMillis()
if (delayTime > 0) delay(delayTime)
}
}
一句话注意
while (isActive) 是关键——isActive 是协程的属性,协程被取消或 ViewModel 清除后变为 false,自动跳出循环。不限时长运行的循环必须检查这个条件,否则协程取消不了。
Timer 的 schedule vs scheduleAtFixedRate 的区别:schedule 等上一个任务执行完才开始计时间隔,scheduleAtFixedRate 按固定周期执行不管上一个任务是否完成。协程中默认 delay 行为类似 schedule。如果需要固定频率,用上面第三个例子记录时间戳补偿每次的延迟。
Java Android 老项目迁移系列,持续更新中。
相关文章
- hive转义字符怎样识别 06-12
- OpenAI收费吗2026版?3种方法确认是否付费 06-12
- hive转义字符怎么用 06-12
- hive coalesce怎样改进 06-12
- hive coalesce能解决啥呢 06-12
- hive coalesce有何使用技巧 06-12