十分钟了解Android Handler、Looper、Message

Android Handler、Looper、Message

在Android开发中,Handler、Looper、Message 是处理线程通信的核心类,特别是在需要更新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进行处理。常用的字段包括what、arg1、arg2和obj。

主要字段

  • what:用于消息的标识,可以是一个整型常量,用来区分不同类型的消息。
  • arg1 和 arg2:消息中的附加数据。
  • 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);

总结

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

参考

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

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
AIgorithmGEEK5 天前
[Linux]线程三部曲(上):一个执行流的诞生——从操作系统一路拆到 pthread_create
linux·线程·pid
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas