十分钟了解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/

相关推荐
飞天卡兹克17 分钟前
forceStop流程会把对应进程的pendingIntent给cancel掉
android
Monkey-旭8 小时前
Android Bitmap 完全指南:从基础到高级优化
android·java·人工智能·计算机视觉·kotlin·位图·bitmap
小宋10218 小时前
多线程向设备发送数据
java·spring·多线程
小学生的信奥之路10 小时前
力扣1116题:用C++实现多线程交替输出零、偶数、奇数
c++·leetcode·多线程
Mike_Wuzy13 小时前
【Android】发展历程
android
开酒不喝车13 小时前
安卓Gradle总结
android
阿华的代码王国14 小时前
【Android】PopupWindow实现长按菜单
android·xml·java·前端·后端
稻草人不怕疼15 小时前
Android 15 全屏模式适配:A15TopView 自定义组件分享
android
静默的小猫15 小时前
LiveDataBus消息事件总线之二-(不含反射和hook)
android
~央千澈~16 小时前
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
android·laravel·软件开发·金融策略