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