十分钟了解Android Handler、Looper、Message

Android Handler、Looper、Message

在Android开发中,HandlerLooperMessage 是处理线程通信的核心类,特别是在需要更新UI或者从后台线程传递数据到主线程时。以下是它们的作用和使用方式。

1. Handler

Handler是Android中用于在不同线程之间发送和处理消息的类。它主要用于将任务调度到某个特定的线程的消息队列中执行,典型的应用场景是主线程(UI线程)中进行UI的更新。

主要功能

  • 发送消息 :通过sendMessage()post()方法将任务或数据发送到消息队列。
  • 处理消息 :重写handleMessage()方法,在此方法中处理收到的消息。
java 复制代码
Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        // 在这里处理消息
    }
};

// 发送消息
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg);

// 发送任务
handler.post(() -> {
    // 在这里执行任务
});

2. Looper

Looper是Android中实现消息循环的类。它将消息放入一个队列中,并循环处理队列中的消息。每个线程(特别是UI线程)可以创建一个Looper对象,消息队列中的消息会被Looper持续处理,直到线程结束。

使用方法

  • 主线程(UI线程)默认已经有一个Looper对象。
  • 子线程需要调用Looper.prepare()来创建一个Looper,然后通过Looper.loop()开始消息循环。
java 复制代码
// 子线程的Looper
new Thread(() -> {
    Looper.prepare();  // 初始化Looper
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // 处理子线程的消息
        }
    };
    Looper.loop();  // 开启消息循环
}).start();

3. Message

Message是Android中用于在线程间传递数据的类。它可以包含少量数据,用于传递给Handler进行处理。常用的字段包括whatarg1arg2obj

主要字段

  • what:用于消息的标识,可以是一个整型常量,用来区分不同类型的消息。
  • arg1arg2:消息中的附加数据。
  • obj:可以附带一个任意对象。
java 复制代码
// 子线程的Looper
new Thread(() -> {
    Looper.prepare();  // 初始化Looper
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // 处理子线程的消息
        }
    };
    Looper.loop();  // 开启消息循环
}).start();

4. 关系

  • Looper:管理消息队列并循环处理消息。
  • Handler:发送和处理消息。
  • Message:包含数据,用于在线程间传递。
java 复制代码
Message msg = Message.obtain();
msg.what = 1; // 设置消息类型
msg.arg1 = 100;
msg.obj = "数据";
handler.sendMessage(msg);

总结

  • HandlerMessage 可以通过Looper在不同线程间传递数据。
  • 主线程默认有Looper,子线程需手动创建。
  • 使用Handler可以简化线程间通信和UI更新的逻辑。

参考

https://mayinjian.wordpress.com/2018/07/01/looper-handler/

相关推荐
QING6181 小时前
Kotlin Delegates.notNull用法及代码示例
android·kotlin·源码阅读
QING6181 小时前
Kotlin filterNot用法及代码示例
android·kotlin·源码阅读
张风捷特烈16 小时前
Flutter 伪3D绘制#03 | 轴测投影原理分析
android·flutter·canvas
omegayy20 小时前
Unity 2022.3.x部分Android设备播放视频黑屏问题
android·unity·视频播放·黑屏
mingqian_chu20 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
自动花钱机20 小时前
Kotlin问题汇总
android·开发语言·kotlin
行墨1 天前
Kotlin 主构造函数
android
前行的小黑炭1 天前
Android从传统的XML转到Compose的变化:mutableStateOf、MutableStateFlow;有的使用by有的使用by remember
android·kotlin
_一条咸鱼_1 天前
Android Compose 框架尺寸与密度深入剖析(五十五)
android
在狂风暴雨中奔跑1 天前
使用AI开发Android界面
android·人工智能