- Android-Handler源码解析-MessageQueue
- Handler、Looper、MessageQueue源码解析—
- Handler、Looper、MessageQueue源码解析—
- Handler、Looper、MessageQueue源码解析—
- Handler、Looper、MessageQueue源码解析—
- Handler源码学习(三) - MessageQueue源码
- Handler源码学习(三)MessageQueue入队插队
- Handler源码学习(二)Message对象池
- Handler、Looper、messagequeue源码分析及
- Handler、Looper、messagequeue源码分析及
Handler涉及的主要类,现在就剩下一个MessageQueue了,这里继续做源码阅读学习。
分析MessageQueue前,先看下他的成员变量:
![](https://img.haomeiwen.com/i14435826/325448c7420dbae4.png)
最重要的就是Message对象了,而Message是我们平时开发中,经常使用到的一个类,MessageQueue其本质上是一个链表,再看看Message的源码:
![](https://img.haomeiwen.com/i14435826/3200525e54ea92b2.png)
主要需要注意的是Handler target 这个属性,从前面的文章可以知道,多个Handler是可以绑定到一个Looper的,那么Looper又是如何知道该执行哪个Handler的方法呢?就是通过target属性,他直接指向对于的Handler实例。
接着看下队列的入队操作:
![](https://img.haomeiwen.com/i14435826/ea8413378c2033f2.png)
入队操作比较简单,就是按照when来给链表做了个排序,加上能唤醒队列。同时注意操作里头的synchronized (this){},说明消息队列是通过synchronized 来实现线程安全的。
继续看下出队操作:
![](https://img.haomeiwen.com/i14435826/b8b868f3dd81f142.png)
补充1: 在msg==null时,nextPollTimeoutMillis 被设置为-1,根据图里的描述,这时会阻塞队列,这也是队列为空时,next()方法会阻塞的原因。
if (msg != null) {
if (now < msg.when) {
...
} else {
...
}
} else {
// No more messages.
nextPollTimeoutMillis = -1;
}
补充2:如果觉得nextPollTimeoutMillis在for循环的结尾被置0难以理解,觉得每次循环都置0没有意义,这里就需要看下continue,循环会在没有idle任务时,会直接跳回循环kai't
if (pendingIdleHandlerCount <= 0) {
// No idle handlers to run. Loop and wait some more.
mBlocked = true;
continue;
}
网友评论