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

【hadler机制】

【hadler机制】

https://www.jianshu.com/p/ba46bad5af67

https://www.cnblogs.com/dendai-05/p/6945159.html

https://www.jianshu.com/p/b63cdff5e661

什么是Handler机制?

Handler机制是AndroidSDK提供的一个非常重要的处理异步消息的机制,主要是由Handler、Looper、Message和MessageQueue组成,Handler只是消息处理机制的一部分。

  • Message:消息(分为硬件产生的消息和软件产生的消息)。
  • MessageQueue:消息队列,主要是向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池中的消息(MessageQueue.next)。
  • Handler:主要功能是向消息池发送消息(Handler.sendMessage)和处理消息(Handler.handleMessage)。
  • Looper:不停的循环执行(Looper.loop),从MessageQueue中取出Message并发送给Handler。

分析上述各部分:

[1] Message

什么是硬件消息和软件消息呢?硬件消息就是我们滑动触摸点击按钮等等,软件消息就是我们主动new Message发送出去的。Message实现了Parcelable接口封装消息数据,所以他是存在于内存中的。一个实体(类)如果需要封装到消息中去就必须实现这一接口。

[2] MessageQueue

相当于一个容器,消息池。上述看到了.next应该猜到是链表形式,实际上确实是单链表维护,在插入和删除上有优势。在其next()中会无限循环,不断的判断是否有消息,有就返回这条消息并移除。

[3] Looper

Looper创建的时候会创建一个MessageQueue,它们两个是一一对应的关系。调用Looper.loop()的时候消息循环开始,不断地调用MessageQueue的next()方法,当有消息就处理,否则就堵塞在next()方法中。loop()跟MessageQueue的next()一样都是死循环(源码可见for(;😉)。退出时调用Looper.quit(),它会调用MessageQueue的quit()方法,此时next会返回null,然后loop()方法也跟着退出。

[4] Handler

在主线程构造Handler,new Handler()里调用了Looper.myLooper()这个方法,这个方法是获取当前线程的Looper的。在其他线程调用sendMessage()时主线程的MessageQueue会插入一条Message,然后被Looper使用,在Looper的loop()中通过回调 msg.target.dispatchMessage(msg);发送给Handler。Handler跟Looper的关系是多对一。

https://www.jianshu.com/p/592fb6bb69fa

我们再来总结下Handler消息机制主要的四个类的功能

  1. Message: 信息的携带者,持有了Handler,存在MessageQueue中,一个线程可以有多个
  2. Hanlder: 消息的发起者,发送Message以及消息处理的回调实现,一个线程可以有多个Handler对象
  3. Looper: 消息的遍历者,从MessageQueue中循环取出Message进行处理,一个线程最多只有一个
  4. MessageQueue: 消息队列,存放了Handler发送的消息,供Looper循环取消息,一个线程最多只有一个

一段Looper的源码片段:

img

**解释完各部分的分工那来总结一下他们之间的关系:**Handler负责发送消息(Message)到MessageQueue中,Looper负责循环的接收MessageQueue中的消息通过回调方法返还给Handler自己本身。

img

相关文章:

  • 【Mongo】uploadify插件帮助实现批量上传
  • 【view的绘制流程】
  • AOS V0.9 发布,JavaEE 应用基础平台
  • 【View事件分发机制 】
  • 闭包--循序学习
  • 【MVCMVPMVVM】
  • 【内存泄露】
  • 默认input=file样式美化的bug及解决
  • 【进程间通信】
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Android知识点总结
  • 无锁和无等待的定义和例子
  • Leetcode Hot100
  • SpringMVC 源码深度解析lt;context:component-scangt;(扫描和注冊的注解Bean)
  • Django中render_to_response和render的区别(转载)
  • [Vue CLI 3] 配置解析之 css.extract
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • canvas 绘制双线技巧
  • gitlab-ci配置详解(一)
  • IDEA常用插件整理
  • Kibana配置logstash,报表一体化
  • MYSQL 的 IF 函数
  • MySQL用户中的%到底包不包括localhost?
  • Sass 快速入门教程
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • - 概述 - 《设计模式(极简c++版)》
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 京东美团研发面经
  • 如何设计一个微型分布式架构?
  • 算法之不定期更新(一)(2018-04-12)
  • 新版博客前端前瞻
  • 用element的upload组件实现多图片上传和压缩
  • 智能合约开发环境搭建及Hello World合约
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Java数据解析之JSON
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #git 撤消对文件的更改
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $(selector).each()和$.each()的区别
  • (1) caustics\
  • (2)MFC+openGL单文档框架glFrame
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Forward) Music Player: From UI Proposal to Code
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)fock函数详解
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .aanva