Handle机制总结

1. handle机制的四个对象

我们通过handle的使用,debug源码调试,以及源码分析其流程,其实handle机制很简单,主要是需要搞出清楚其核心的四个对象:Message, Handle,MessageQueue,Looper。

handle的机制主要涉及到四个对象:

  1. Message对象:封装消息对象,并且通过target持有handler,将消息与handle进行绑定
  2. Handle对象:负责发送消息和处理消息。
  3. MessageQueue对象:消息队列对象,负责存取管理消息顺序,以先进先出的方式存取的Message对象,
  4. Looper对象:消息轮询,轮询管理消息队列,负责轮询从消息队列中取出Message对象

下面通过一张图来总结这个四个对象的流程关系

几个核心问题?

1. handle是如何进行对象绑定的?
Handler创建的时候会创建一个Looper对象,looper对象又会创建一个MeesageQuenu对象,这样就将Handle,Looper,MessageQuenue绑定在一起,handle添加消息的时候,会将自己(handle)绑定到Message的target中,这样串起来就将Handle,Looper,MessageQueue,Message四个对象绑定在一起了。
2. 消息内部存储结构?
消息是通过MessageQueue对象,messageQueue 数据结构是单链表结构,不是队列结构。
3. Looper的是在哪个线程运行的?
一般如果我们之间在UI主线程中创建handler这时候会默认创建一个主线程的Looper对象,对应Looper也是运行在主线程的。

2.源码分析

下面我们可以通过阅读查看Handle机制的关键源码从而理清相关关系。
我们前面提到了handle机制关键对象是Handle、Looper、Message、MessageQuenu,下面我们就从这个四个核心类进行分析。
首先是handle创建:

  1. handle创建的时候会获取一个Looper对象(没有还没创建,则会通过Looper.prepare创建一个Looper)
  2. 如果handle是在主线程中创建的,那么这时候创建的Looper对象也是在主线程的。

Looper对象的创建

Looper创建的时候会创建MessageQueue,looper持有MessageQueue对象

至此Handler,Looper, MessageQueue创建并绑定完成了,
下面分析消息处理分发流程

1. handler发送消息:
将handler绑定到Message对象的target中,同时将消息Message添加到MessageQueue中.

2. Looper的轮询从MessageQueue中获取消息

3. handler分发消息(处理消息)

到此我们针对Handle机制的四个核心类以及源码主干流程简析已经完成,因本文书写时间和水平有限,如有有错误及不足之处,烦请指出。如果能帮助到正在阅读的你,也希望能够得到你的支持和鼓励,欢迎点赞,收藏,评论,转发。。。。谢谢。

Handle机制总结相关推荐

  1. Handle机制详解

    一.Android消息机制一 Android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先 ...

  2. Android Handle机制

    目录 整个消息的循环流程还是比较清晰的,具体说来: 总结: Handler 引起的内存泄露原因以及最佳解决方案: 为什么我们能在主线程直接使用 Handler,而不需要创建 Looper ? 主线程的 ...

  3. Android客户端与服务器之间的通信

    本文将介绍Android客户端与服务器端的通信的简单实现方法. 要两点需要注意的地方: 1.Android 端记得在AndroidManifest.xml里记得获取一下网络权限,否则无法进行网络通信, ...

  4. Android四大组件之BroadCast(续)

    1.哪一个方法可以发送广播? activity.sendbroadcast or context.sentbroadcast or service.sendbroadcast 2.创建广播接受程序必须 ...

  5. 面试-android

    - 工具的使用 调查内存泄漏工具: LeakCanary 如果只关注activity的内存泄漏,那么在Application中onCreate加入RefWatcher ref = LeakCanary ...

  6. Android面试经验一:

    一.第一轮我是在前程无忧投的简历,然后hr打电话给我,进行首轮电话面试 首先是他介绍公司的情况,和了解我一些的基本情况,比如,之前的实习情况,做过哪些项目,自己负责哪部分,以及那些项目发布了没.其实, ...

  7. 《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享

    Go语言精进之路,从新手到高手的编程思想.方法和技巧 读书分享 1 本书定位 2 本书内容总览 3 选择本书的原因 4 小收获分享 第7-12条 真的不知道咋命名 第13-19条 能用--怎么用更好 ...

  8. GO语言开发高性能网络通信服务

    前言 轻松的几行代码就可以实现tcp/IP的高性能的网络通信,今天就来介绍一下,使用boot4go-fastnet来实现一个简单的网络通信的例子. 昨天的文章,介绍了boot4go-fastnet的实 ...

  9. Android蓝牙系统框架和代码架构

    二.蓝牙Bluetooth源码目录分析 1.Bluetooth的设置应用 路径:\packages\apps\Settings\src\com\android\settings\bluetooth 蓝 ...

最新文章

  1. Css3从IE6-IE9的支持查看
  2. 自已写的几个分页的存储过程
  3. 青年歌手大奖赛_评委会打分
  4. PHP连接MSSQL
  5. django-动漫节目列表,后台的操作
  6. spring boot: 支持jsp,支持freemarker
  7. 若依集成ueditor富文本编辑器
  8. 【题解】洛谷P3435 [POI2006] OKR-Periods of Words(KMP)
  9. 递归算法经典实例python-python-动态规划的递归、非递归实现
  10. 【渝粤题库】陕西师范大学165111 薪酬管理 作业(高起专)
  11. SHT20温湿度传感器工作原理
  12. 《创业时代》原型:为什么Talkbox、子弹短信都失败了?
  13. 数据库维护任务-邮件通知:未配置全局配置文件。请在 @profile_name 参数中指定配置文件名。
  14. c语言 字符转换成ascii吗,C语言字符转换ASCII码
  15. 【SpringCloud】Could not find artifact org.springframework.cloud:spring-cloud-starter-xxx
  16. 炉石传说 爬取全部卡牌
  17. 洛谷 P4379 [USACO18OPEN]Lemonade Line
  18. 手机安装charles证书与雷电模拟器4.0安装charles证书流程
  19. hook failed (add --no-verify to bypass)
  20. 计算机工程的突出技能该怎么写,没有科研竞赛,计算机保研简历应该怎么写?...

热门文章

  1. Inno Setup覆盖安装前执行卸载、获取原安装路径
  2. 综合网上各种虚拟机网络解决方式的合集(或足以解决碰到的任何虚拟机网络问题)
  3. vue中划词选中后高亮显示web-highlighter插件
  4. CSDN用户社区内测启动!快加入《Java技术江湖——狗腿分湖》
  5. 卸载 MacPorts
  6. [PHP Mud]死还是不死是个问题
  7. 对话机器人之QnA Maker
  8. 数据结构及算法课程感悟
  9. QQ面板上的所有链接按钮、qq聊天窗口中的那些超级链接打不开的原因
  10. 微信开发者工具 微信小程序中调试器console界面不显示跑出的代码结果的问题解决