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

相关推荐
一笑的小酒馆5 小时前
Android launcher3实现简单的负一屏功能
android
xuyin12045 小时前
【Android】Flow基础知识和使用
android
李新_7 小时前
基于Markwon封装Markdown组件
android·aigc·markdown
Non-existent9879 小时前
Flutter + FastAPI 30天速成计划自用并实践-第10天-组件化开发实践
android·flutter·fastapi
@老蝴11 小时前
MySQL数据库 - 约束和联合查询
android·数据库·mysql
ljt272496066111 小时前
Compose笔记(六十一)--SelectionContainer
android·笔记·android jetpack
有位神秘人12 小时前
Android中Compose系列之按钮Button
android
AI科技摆渡12 小时前
GPT-5.2介绍+ 三步对接教程
android·java·gpt
csdn122598733613 小时前
Android12 新启动页到底该怎么做
android·启动页
aaajj14 小时前
【Android】关于MY_PACKAGE_REPLACED广播
android