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 老项目迁移系列,持续更新中。

相关推荐
文丑颜不良啊3 小时前
LeetCode1461~1480题目解析
java·leetcode
2301_7807896610 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设11 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn12 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川12 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵12 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David12 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10012 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin13 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质13 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring