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

Handler消息传递机制

1、Handler类方法:

handleMessage(Message msg):处理消息的方法,该方法通常被重写

HasMessage(int what):检查消息队列重是否包含what属性为指定值的消息

HasMessage(int what,Object):检查消息队列重是否包含what属性为指定值且object属性为制定对象的消息

多个重载的Message obtainMessage()获取消息

sendEmptyMessage(int what): 发送空消息

sendEmptyMessageDelayed(int what,long delayMillis): 指定多少毫秒之后发送空消息。

sendMessage(int what,long delayMillis): 立即发送消息。

sendMessageDelayed(int what,long delayMillis): 指定多少毫秒之后发送消息。 

可借助上面的这些方法,方便地利用Handler来进行消息传递。

2、工作原理

Message:Handler接收和处理消息对象;

Looper:每个线程只能拥有一个Looper,它的loop()方法负责读取MessageQueue中的消息,读到消息之后就把消息交给Handler进行处理。

MessageQueue:消息队列,它采用先进先出的方式。程序创建Looper对象时,会在它的构造里面创建MessageQueue对象。即:Looper和MessageQueue是唯一且关联的。

Handler:使用Handler发送消息,由Handler发送的消息必须被送到指定的MessageQueue,也就是说,如果希望Handler正常工作,必须在当前的线程中有一个MessageQueue,否则消息就没法保存。

不过MessageQueue是由Looper负责管理,也就是说,如果希望Handler正常工作,必须在当前线程中有一个Looper对象。为了保证当前线程中又Looper对象,可以分为2个情况讨论:

(1)在主Ui线程,系统已经初始化了一个Looper对象。因此程序可以直接创建Handler即可,然后就可以通过Handler来发送、处理消息。

(2)程序员自己启动一个子线程,必须自己创建一个Looper对应,并启动它。创建Looper对应调用prepare()方法。、

3、总结下

(1)Looper:每一个线程只有一个Looper,负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理。

(2)MessageQueue:由Looper负责管理。

(3)Handler:它能把消息送到Looper管理的MessageQueue,并负责处理Looper分为它的消息。

4、针对在子线程中使用Handler的步骤:

(1)调用Looper的prepare()方法为当前的线程创建Looper对象,创建Looper对象时,它的构造器会创建创建与之搭配的MessageQueue

(2)有了Looper之后,创建Handler的实例,重写handleMessage()方法,该方法负责处理来自其他线程的消息。

(3)调用Looper的loop()方法启动looper。

Handler+Message异步消息处理机制_冰之沁泠的博客-CSDN博客

相关文章:

  • Django之路由匹配
  • Java面试(四)JVM基础
  • 新学期,新FLAG
  • 一文详解C语言文件
  • Java实现的一个编译器源代码(Win11)
  • 内核调试:crash工具与vmcore实践
  • C++ Qt / VS2019 +opencv + onnxruntime 部署语义分割模型【经验】
  • 如何查看线程死锁
  • 代码源每日一题div2 可重排列
  • 【原创】基于Jsp+Servlet的仓库管理系统
  • 堡垒机部署
  • linux的man命令
  • 10 项目沟通管理
  • 三分钟了解JVM的垃圾回收和三色标记
  • MapStruct简单入门
  • #Java异常处理
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java基本数据类型之Number
  • JAVA之继承和多态
  • js ES6 求数组的交集,并集,还有差集
  • Js基础知识(四) - js运行原理与机制
  • linux安装openssl、swoole等扩展的具体步骤
  • ViewService——一种保证客户端与服务端同步的方法
  • win10下安装mysql5.7
  • 测试开发系类之接口自动化测试
  • 多线程事务回滚
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊聊flink的TableFactory
  • 前嗅ForeSpider教程:创建模板
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 什么软件可以剪辑音乐?
  • 事件委托的小应用
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Semaphore
  • ​queue --- 一个同步的队列类​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #162 (Div. 2)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • ${ }的特别功能
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (09)Hive——CTE 公共表达式
  • (js)循环条件满足时终止循环
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)fock函数详解
  • ******之网络***——物理***
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端