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

Android开发-Handler消息机制记录

背景

Handler在Android中非常重要,它可以实现线程之间的通信,Android中对于UI的更新只能在主线程中进行,所以Handler的地位非常重要,包括可以处理一些多个线程同时更新UI时的操作,Handler就是为了解决线程间通信而出现的。

Handler的使用

Handler和MessageQueue, Looper, Message共同构成一个消息处理机制,如下是Handler基本使用代码示例

// 创建Handler对象,获取主线程Looper
val mHandler = object : Handler(Looper.getMainLooper()) {override fun handleMessage(msg: Message) {when (msg.what) {1 -> {// 处理消息}}}}// 其他线程需要通知时调用sendMessage发消息通知目标线程thread { val msg = Message()msg.what = 1mHandler.sendMessage(msg)}

接下来解析下Handler消息处理机制的每一个组成部分的作用

  • Handler: 用于消息的发送和处理
  • Message: 携带消息的内容,参数有what、arg1、arg2(储存整型数据)、obj(储存对象类型)
  • MessageQueue: 管理消息的队列,每个线程拥有一个
  • Looper: 每个线程都有一个自己的Looper,管理MessageQueue,不断的循环从消息队列中取出消息并分发给相应的Handler

Handler原理

在这里插入图片描述

Handler机制过程

  • 发送消息:需要通信的线程创建一个Handler对象用于发送消息传递信息,通过调用Handler的发送消息的方法来发送Message到MessageQueue,根据Handler源码可以发现如下发送消息的方法:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//public class Handler {...public final boolean post(@NonNull Runnable r) {throw new RuntimeException("Stub!");}public final boolean postAtFrontOfQueue(@NonNull Runnable r) {throw new RuntimeException("Stub!");}public final boolean postAtTime(@NonNull Runnable r, @Nullable Object token, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean postAtTime(@NonNull Runnable r, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean postDelayed(@NonNull Runnable r, @Nullable Object token, long delayMillis) {throw new RuntimeException("Stub!");}public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {throw new RuntimeException("Stub!");}public final boolean sendEmptyMessage(int what) {throw new RuntimeException("Stub!");}public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {throw new RuntimeException("Stub!");}public final boolean sendMessage(@NonNull Message msg) {throw new RuntimeException("Stub!");}public final boolean sendMessageAtFrontOfQueue(@NonNull Message msg) {throw new RuntimeException("Stub!");}public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {throw new RuntimeException("Stub!");}
}

可以发现以上源码中post开头的方法都有一个Runnable参数,所以使用post传递信息时,当Handler从队列取出一个Message后执行到dispatchMessage()方法进行分发时会自动处理post中的自定义Runnable,而不会去执行Handler中重写的handleMessage方法
同理,send开头的方法可以将数据封装到Bundle中绑定到Message或者设置msg.what的值来进行区分然后分发到对应传入的回调接口的handleMessage方法中处理(需要先在接收的线程中实现一个Handler类然后重写下handleMessage方法)

  • Looper事件循环:在线程中先调用Looper.prepare(),然后通过Looper.loop()让线程开始循环处理消息,如果一段时间后如果不需要了也可以调用Looper.end()结束当前所在线程的循环器,可以通过Looper.myQueue()获取到线程中的MessageQueue
  • 处理消息:需要接收通信的线程创建一个Handler对象用于接收信息,创建Handler对象后需要重写handleMessage()方法来处理其他线程获取到的信息并进行相应操作处理

源码解析

Handler源码

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package android.os;import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.Printer;public class Handler {/** @deprecated */@Deprecatedpublic Handler() {throw new RuntimeException("Stub!");}/** @deprecated */@Deprecatedpublic Handler(@Nullable Callback callback) {throw new RuntimeException("Stub!");}public Handler(@NonNull Looper looper) {throw new RuntimeException("Stub!");}public Handler(@NonNull Looper looper, @Nullable Callback callback) {throw new RuntimeException("Stub!");}@NonNullpublic static Handler createAsync(@NonNull Looper looper) {throw new RuntimeException("Stub!");}@NonNullpublic static Handler createAsync(@NonNull Looper looper, @NonNull Callback callback) {throw new RuntimeException("Stub!");}public void dispatchMessage(@NonNull Message msg) {throw new RuntimeException("Stub!");}public final void dump(@NonNull Printer pw, @NonNull String prefix) {throw new RuntimeException("Stub!");}@NonNullpublic final Looper getLooper() {throw new RuntimeException("Stub!");}@NonNullpublic String getMessageName(@NonNull Message message) {throw new RuntimeException("Stub!");}public void handleMessage(@NonNull Message msg) {throw new RuntimeException("Stub!");}public final boolean hasCallbacks(@NonNull Runnable r) {throw new RuntimeException("Stub!");}public final boolean hasMessages(int what) {throw new RuntimeException("Stub!");}public final boolean hasMessages(int what, @Nullable Object object) {throw new RuntimeException("Stub!");}@NonNullpublic final Message obtainMessage() {throw new RuntimeException("Stub!");}@NonNullpublic final Message obtainMessage(int what) {throw new RuntimeException("Stub!");}@NonNullpublic final Message obtainMessage(int what, int arg1, int arg2) {throw new RuntimeException("Stub!");}@NonNullpublic final Message obtainMessage(int what, int arg1, int arg2, @Nullable Object obj) {throw new RuntimeException("Stub!");}@NonNullpublic final Message obtainMessage(int what, @Nullable Object obj) {throw new RuntimeException("Stub!");}public final boolean post(@NonNull Runnable r) {throw new RuntimeException("Stub!");}public final boolean postAtFrontOfQueue(@NonNull Runnable r) {throw new RuntimeException("Stub!");}public final boolean postAtTime(@NonNull Runnable r, @Nullable Object token, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean postAtTime(@NonNull Runnable r, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean postDelayed(@NonNull Runnable r, @Nullable Object token, long delayMillis) {throw new RuntimeException("Stub!");}public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {throw new RuntimeException("Stub!");}public final void removeCallbacks(@NonNull Runnable r) {throw new RuntimeException("Stub!");}public final void removeCallbacks(@NonNull Runnable r, @Nullable Object token) {throw new RuntimeException("Stub!");}public final void removeCallbacksAndMessages(@Nullable Object token) {throw new RuntimeException("Stub!");}public final void removeMessages(int what) {throw new RuntimeException("Stub!");}public final void removeMessages(int what, @Nullable Object object) {throw new RuntimeException("Stub!");}public final boolean sendEmptyMessage(int what) {throw new RuntimeException("Stub!");}public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {throw new RuntimeException("Stub!");}public final boolean sendMessage(@NonNull Message msg) {throw new RuntimeException("Stub!");}public final boolean sendMessageAtFrontOfQueue(@NonNull Message msg) {throw new RuntimeException("Stub!");}public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {throw new RuntimeException("Stub!");}public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {throw new RuntimeException("Stub!");}public String toString() {throw new RuntimeException("Stub!");}public interface Callback {boolean handleMessage(@NonNull Message var1);}
}
http://www.dtcms.com/a/414547.html

相关文章:

  • 通信专业知识图谱​
  • 网站建设的页面要求一级域名二级域名
  • 基础镜像清理策略在VPS环境存储优化中的维护规范
  • The 2025 ICPC South America - Brazil First Phase
  • 开源 C# 快速开发(六)自定义控件--圆环
  • Calico 网络插件在 K8s 集群的作用
  • 蓝桥杯13届省题
  • 手机网站开发+图库类怎样在手机上建设网站
  • MySQL三层架构:从连接管理到数据存储
  • 嵌入式硬件——IMX6ULL时钟配置
  • 【用androidx.camera拍摄景深合成照片】
  • linux安装google chrome 谷歌浏览器
  • 从零起步学习Redis || 第二章:Cache Aside Pattern(旁路缓存模式)以及优化策略
  • 两性做受技巧视频网站喊别人做的网站不肯给代码
  • ESP32-S3入门第八天:往期知识回顾与实战练习
  • Claude Code 实战指南(三):AI辅助开发工作流 Spec Workflow MCP教程
  • 红帽认证含金量怎么样?适合哪些人?
  • 宣传的网站开发需要多少钱步骤的英文
  • 选择一款拖拽式界面的vscode扩展程序制作Python界面
  • Android开发-屏幕变更事件
  • 十大咨询公司排行榜aso优化师主要是干嘛的
  • LeetCode第1346题 - 检查整数及其两倍数是否存在
  • 【Leetcode hot 100】207.课程表
  • 搜索引擎高级搜索技巧
  • 2.3 物理层设备 (答案见原书 P48)
  • 华为OBS obsutil使用
  • 租购同权七年之痒:政策善意如何变现?
  • 【Linux操作系统】基础开发工具
  • 老年ai模拟恋爱抖音快手微信小程序看广告流量主开源
  • 知名的网站制作公司需要多少钱企业宣传网站模板下载