Timer → Coroutines

Timer → Coroutines

老写法(Java)

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)

kotlin 复制代码
// 延时执行一次
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 老项目迁移系列,持续更新中。

相关推荐
Wang's Blog3 分钟前
Java 中间件之 RabbitMQ 快速入门: MQ 常见技术选型对比
java·中间件·java-rabbitmq
蜗牛互联网3 分钟前
Java Agent 工具调用的 allowlist、参数校验与调用预算
java·开发语言·人工智能·后端·oracle
大文说跨境4 分钟前
多账号环境隔离方案技术选型:指纹浏览器、VPS 与云手机的三种架构对比
java·开发语言·前端
骉马代驾12 分钟前
代驾系统长连接实战(二):心跳、断线重连与消息补偿的完整实现
java
ZHOUPUYU15 分钟前
PHP 8.2 的核心高级特性,包括只读类、类型系统增强
android·性能优化·php
程序员Sunday18 分钟前
Spring @Transactional 没回滚?按代理调用、异常和传播行为排查
java·后端·spring
ZHOUPUYU26 分钟前
PHP 8.0 高级技术实战:从新特性到性能优化
android·性能优化·php
冰暮流星28 分钟前
sql之is null 运算符
java·数据库·sql
不爱说话郭德纲28 分钟前
从“点点点”到一键出包:我把 uni-app x Android 离线打包做成了脚本
android·前端·uni-app
Rain的Java大神之路28 分钟前
🔥13年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·后端·面试