Handler/Looper → Coroutines

Handler/Looper → Coroutines

老写法(Java)

java 复制代码
// 延迟执行
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        updateUI();
    }
}, 1000);

// 子线程发消息到主线程
private Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 1) {
            String data = (String) msg.obj;
            updateUI(data);
        }
    }
};

// 在子线程发送
Message msg = handler.obtainMessage(1, "结果");
handler.sendMessage(msg);

// 定时重复任务
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        doPeriodicWork();
        handler.postDelayed(this, 5000);
    }
}, 5000);

问题在哪里

Handler 三个问题:线程间消息用 what 整型区分,代码一多根本记不住哪个数字代表什么;Message.obj 强转类型不安全;忘记 removeCallbacks 会造成内存泄漏。

新写法(Kotlin + Coroutines)

kotlin 复制代码
// 延迟执行
viewModelScope.launch {
    delay(1000)
    updateUI()
}

// 子线程返回结果到主线程
viewModelScope.launch {
    val result = withContext(Dispatchers.IO) {
        doHeavyWork()
    }
    updateUI(result)
}

// 定时重复任务
viewModelScope.launch {
    while (isActive) {
        doPeriodicWork()
        delay(5000)
    }
}

// 线程间通信 --- 用 Channel 替代 Handler 消息
private val channel = Channel<String>(capacity = Channel.BUFFERED)

viewModelScope.launch {
    for (data in channel) {
        updateUI(data)
    }
}

一句话注意

delay() 是挂起函数,不阻塞线程。和 Thread.sleep() 完全不同------delay 期间当前协程让出线程资源,其他协程可以继续使用该线程。Handler 的 postDelayed 依赖 MessageQueue,存在 Handler 持有 Activity 引用导致泄漏的风险,而协程配合 viewModelScope 自动取消,不存在这个问题。

Channel 替代 Handler 消息时注意,如果生产者快过消费者,Channel.BUFFERED 默认 64 个元素,超出会挂起生产者。如果需要无线缓冲用 Channel.UNLIMITED,但要注意内存。


Java Android 老项目迁移系列,持续更新中。

相关推荐
Bs_MoneyMagnet2 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
Mr YiRan6 小时前
网络请求API监控与网络切换埋点
android·网络
野生技术架构师8 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
香吧香8 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
qq_2518364579 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
逆境不可逃9 小时前
Pi Agent 学习笔记:对话太长以后,如何压缩上下文
java
MetaLite9 小时前
JDK 8~26 核心特性一览:从 Stream 到 Scoped Values
java
美狐美颜sdk9 小时前
直播APP开发技术栈详解:视频美颜SDK、人脸识别与实时渲染
android·人工智能·音视频·美颜sdk·直播美颜sdk
wno70410 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
君顾110 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房