Handle机制总结
Handle机制总结
1. handle机制的四个对象
我们通过handle的使用,debug源码调试,以及源码分析其流程,其实handle机制很简单,主要是需要搞出清楚其核心的四个对象:Message, Handle,MessageQueue,Looper。
handle的机制主要涉及到四个对象:
- Message对象:封装消息对象,并且通过target持有handler,将消息与handle进行绑定
- Handle对象:负责发送消息和处理消息。
- MessageQueue对象:消息队列对象,负责存取管理消息顺序,以先进先出的方式存取的Message对象,
- 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创建:
- handle创建的时候会获取一个Looper对象(没有还没创建,则会通过Looper.prepare创建一个Looper)
- 如果handle是在主线程中创建的,那么这时候创建的Looper对象也是在主线程的。
Looper对象的创建
Looper创建的时候会创建MessageQueue,looper持有MessageQueue对象
至此Handler,Looper, MessageQueue创建并绑定完成了,
下面分析消息处理分发流程
1. handler发送消息:
将handler绑定到Message对象的target中,同时将消息Message添加到MessageQueue中.
2. Looper的轮询从MessageQueue中获取消息
3. handler分发消息(处理消息)
到此我们针对Handle机制的四个核心类以及源码主干流程简析已经完成,因本文书写时间和水平有限,如有有错误及不足之处,烦请指出。如果能帮助到正在阅读的你,也希望能够得到你的支持和鼓励,欢迎点赞,收藏,评论,转发。。。。谢谢。
Handle机制总结相关推荐
- Handle机制详解
一.Android消息机制一 Android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先 ...
- Android Handle机制
目录 整个消息的循环流程还是比较清晰的,具体说来: 总结: Handler 引起的内存泄露原因以及最佳解决方案: 为什么我们能在主线程直接使用 Handler,而不需要创建 Looper ? 主线程的 ...
- Android客户端与服务器之间的通信
本文将介绍Android客户端与服务器端的通信的简单实现方法. 要两点需要注意的地方: 1.Android 端记得在AndroidManifest.xml里记得获取一下网络权限,否则无法进行网络通信, ...
- Android四大组件之BroadCast(续)
1.哪一个方法可以发送广播? activity.sendbroadcast or context.sentbroadcast or service.sendbroadcast 2.创建广播接受程序必须 ...
- 面试-android
- 工具的使用 调查内存泄漏工具: LeakCanary 如果只关注activity的内存泄漏,那么在Application中onCreate加入RefWatcher ref = LeakCanary ...
- Android面试经验一:
一.第一轮我是在前程无忧投的简历,然后hr打电话给我,进行首轮电话面试 首先是他介绍公司的情况,和了解我一些的基本情况,比如,之前的实习情况,做过哪些项目,自己负责哪部分,以及那些项目发布了没.其实, ...
- 《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享
Go语言精进之路,从新手到高手的编程思想.方法和技巧 读书分享 1 本书定位 2 本书内容总览 3 选择本书的原因 4 小收获分享 第7-12条 真的不知道咋命名 第13-19条 能用--怎么用更好 ...
- GO语言开发高性能网络通信服务
前言 轻松的几行代码就可以实现tcp/IP的高性能的网络通信,今天就来介绍一下,使用boot4go-fastnet来实现一个简单的网络通信的例子. 昨天的文章,介绍了boot4go-fastnet的实 ...
- Android蓝牙系统框架和代码架构
二.蓝牙Bluetooth源码目录分析 1.Bluetooth的设置应用 路径:\packages\apps\Settings\src\com\android\settings\bluetooth 蓝 ...
最新文章
- Css3从IE6-IE9的支持查看
- 自已写的几个分页的存储过程
- 青年歌手大奖赛_评委会打分
- PHP连接MSSQL
- django-动漫节目列表,后台的操作
- spring boot: 支持jsp,支持freemarker
- 若依集成ueditor富文本编辑器
- 【题解】洛谷P3435 [POI2006] OKR-Periods of Words(KMP)
- 递归算法经典实例python-python-动态规划的递归、非递归实现
- 【渝粤题库】陕西师范大学165111 薪酬管理 作业(高起专)
- SHT20温湿度传感器工作原理
- 《创业时代》原型:为什么Talkbox、子弹短信都失败了?
- 数据库维护任务-邮件通知:未配置全局配置文件。请在 @profile_name 参数中指定配置文件名。
- c语言 字符转换成ascii吗,C语言字符转换ASCII码
- 【SpringCloud】Could not find artifact org.springframework.cloud:spring-cloud-starter-xxx
- 炉石传说 爬取全部卡牌
- 洛谷 P4379 [USACO18OPEN]Lemonade Line
- 手机安装charles证书与雷电模拟器4.0安装charles证书流程
- hook failed (add --no-verify to bypass)
- 计算机工程的突出技能该怎么写,没有科研竞赛,计算机保研简历应该怎么写?...