1. 简述
首先看一下Google官方的简述:Low-level class holding the list of messages to be dispatched by a Looper. Messages are not added directly to a MessageQueue, but rather through Handler objects associated with the Looper.
简单翻译一下就是说:MessageQueue是比较低层的类,是持有Message的一个链表(由Looper分发)。Messages不是直接添加到MessageQueue中的,而是通过与Looper相关联的Handler来进行的。
在Android的消息机制中,MessageQueue最主要的方法就是它的插入和读取方法,分别对应enqueueMessage和next。因此主要分析这两个方法。
2. 源码解析
2.1 enqueueMessage
首先来看消息的插入方法,源码如下:
|
|
当第一条message进来时,满足p == null || when == 0 || when < p.when条件,将当前msg.next指向p,即为null,再将mMessage赋值为当前msg。完成第一条数据的插入操作。
此后来的消息(假设消息的when == 0或者小于上个消息的when的值),则会作为头消息插入,即新来的消息是从头部开始插入的,最终形成一个单链表,当方法执行完之后,p会被垃圾回收器回收。
假设后面来的消息的when不为0 或者when比上条消息的when大,那么会走进else部分即:
|
|
进入一个无限循环,想要跳出循环的话,只能break,也就是要满足p == null || when < p.when,也就是说到了消息队列的最后一个节点或者找到某个节点的when比要插入的msg的when大。break之后,执行:
|
|
由此将msg插入p和prev之间。
因此,消息队列是基于when的先后顺序排列的,需要尽快处理的消息排在最前面
2.2 next
next方法用来读取消息,源码如下:
|
|
由for循环可以看出该方法是一个无限循环的方法,当没有消息的时候,该方法会无限阻塞在这里。当有新消息到来时,即msg ! = null同时msg.when <= now,执行如下代码:
|
|
返回msg,并且将其从单链表中移除。
以上。