当前位置: 首页 > java >正文

消息处理机制 Handler、Looper 和 MessageQueue

在 Android 开发里,消息处理机制由 HandlerLooperMessageQueue 构成,主要用于线程间通信。以下为你详细介绍:

1. 整体工作原理概述

在 Android 中,为避免阻塞主线程(UI 线程)导致界面卡顿,耗时操作(如网络请求、文件读写)需在子线程执行。但更新 UI 只能在主线程进行,这时就需要借助消息处理机制把任务从子线程传递到主线程。该机制的核心工作流程是:子线程把消息发送到消息队列,主线程从消息队列取出消息并处理。

2. 核心组件详细介绍

MessageQueue
  • 定义MessageQueue 即消息队列,本质是一个基于单链表的数据结构,用于存储 Message 对象。Message 是一个封装了消息数据和处理信息的类,它包含了消息的标识、携带的数据等内容。
  • 作用:它负责管理和维护消息,遵循先进先出(FIFO)原则。当有新的消息被发送过来时,会被添加到队列的尾部;而 Looper 会从队列的头部取出消息进行处理。
Looper
  • 定义Looper 负责循环从 MessageQueue 中取出消息,并将其分发给对应的 Handler 进行处理。每个线程只能有一个 Looper 对象,并且可以通过 Looper.prepare() 方法为当前线程创建 Looper,通过 Looper.loop() 方法启动消息循环。
  • 作用:不断地从 MessageQueue 中取出消息,然后将消息传递给相应的 Handler 进行处理。只要 MessageQueue 中有消息,Looper 就会持续循环处理,直到调用 Looper.quit() 方法退出循环。
Handler
  • 定义Handler 是消息的发送者和处理者,主要用于发送消息到 MessageQueue 以及处理从 MessageQueue 中取出的消息。可以在创建 Handler 时指定关联的 Looper,如果不指定,则默认关联当前线程的 Looper
  • 作用
    • 发送消息:提供了多种发送消息的方法,如 sendMessage()post() 等。通过这些方法,可以将消息发送到 MessageQueue 中等待处理。
    • 处理消息:通过重写 handleMessage() 方法来处理从 MessageQueue 中取出的消息。当 LooperMessageQueue 中取出消息并分发给 Handler 时,Handler 会调用 handleMessage() 方法进行具体的处理。

3. 示例代码及工作流程

以下是一个简单的示例代码,展示了如何使用 HandlerLooperMessageQueue 进行线程间通信:

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;// 子线程类
class MyThread extends Thread {// 用于接收和处理消息的 Handlerpublic Handler handler;@Overridepublic void run() {// 为当前线程创建 LooperLooper.prepare();// 创建 Handler 并关联当前线程的 Looperhandler = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(Message msg) {// 处理接收到的消息Log.d("MyThread", "Received message: " + msg.obj);}};// 启动消息循环Looper.loop();}
}public class Main {public static void main(String[] args) {// 创建并启动子线程MyThread myThread = new MyThread();myThread.start();try {// 等待子线程初始化完成Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 主线程向子线程发送消息Message message = Message.obtain();message.obj = "Hello from main thread!";myThread.handler.sendMessage(message);}
}

代码解释:

  1. 子线程启动:在 MyThread 类的 run() 方法中,首先调用 Looper.prepare() 为当前线程创建 Looper,然后创建 Handler 并关联该 Looper,最后调用 Looper.loop() 启动消息循环。
  2. 消息发送:在 Main 类的 main() 方法中,创建并启动 MyThread 线程,等待子线程初始化完成后,通过 myThread.handler.sendMessage() 方法向子线程发送消息。
  3. 消息处理:子线程的 Handler 接收到消息后,会调用 handleMessage() 方法进行处理。

通过上述机制,HandlerLooperMessageQueue 共同协作,实现了 Android 中的线程间通信。

http://www.xdnf.cn/news/3031.html

相关文章:

  • DeepSeek 联手 Word,开启办公开挂模式
  • windows编译chromium环境配置官方文档说明
  • 信息系统项目管理工程师备考计算类真题讲解十一
  • 什么叫自媒体矩阵营销,多个账号ip关联如何处理
  • MapReduce的shuffle过程详解
  • IIC小记
  • ​Indira量化APP集成IAS 2.0服务器矩阵协议,正式更新上线苹果App Store
  • AI工具 Trae 创建java项目和配置运行环境完整示例
  • java 短信服务
  • 域名与DNS理解
  • 4.2.3 MYSQL事务原理分析
  • 纯C协程框架NtyCo
  • 合并两个有序链表
  • xGAP-200-SE7K-L(300T)测试
  • Git 实操:如何使用交互式 Rebase 移除指定提交(真实案例分享)
  • 公路安全知识竞赛主持稿串词
  • Express 文件上传不迷路:req.files 一次性讲明白
  • 洛谷P2142高精度减法题解
  • USB 网卡——RNDIS 控制消息流程
  • AbMole解密生物医学新材料---PCL-PVAc-PEG
  • AUTOSAR图解==>AUTOSAR_RS_InteroperabilityOfAutosarTools
  • 同步与互斥(同步)
  • 【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SSM/BV-02-C】
  • 数据中心网络架构:高效规划与自动化设计实践
  • Android 系统发展史
  • php学习笔记(全面且适合新手)
  • Android的Imageview的src属性,如果设置width和height,但是图片本身很小,那么图片会自动缩放到Imageview一样的大小吗
  • GEE进行Theil-Sen Median斜率估计和Mann-Kendall检验
  • RK3568下背光控制 软件与调试技巧
  • 使用 TypeScript 开发并发布一个 npm 包(完整指南)