上一篇的地址为 Android Handler源码解析
通过上两篇的讲解,我们知道线程会一直阻塞在Looper的loop方法中,并且调用其MessageQueue的next()方法得到其Message,然后去执行,而Handler在发送消息时,其实是将消息发送给其绑定的MessageQueue。
同样带着问题去探索。
1、Handler会调用queue.enqueueMessage(msg, uptimeMillis)将消息入队,并指定Message的时间,那么MessageQueue是通过何种数据结构来将Message入队,并且能正确的根据当前时间执行MessageQueue(因为Message是带有时间的)?
2、线程得到当前的Message之后,是如何来进行执行的?
一、解决第一个问题,MessageQueue存储的数据结构:
我们首先看一下Message的源码:
public final class Message implements Parcelable {
Handler target;
// sometimes we store linked lists of these things
Message next;
......
}
可以看出,每个Message都有一个指向自己的引用,也就是说,它是采用数据结构中的链表进行存储,那么,在不考虑每个Message的时间的情况下,如果有新的Message传入,那么只需要将MessageQueue的最后一个Message的引用指向传入的Message即可。
我们来看一下MessageQueue的enqueueMessage(msg, uptimeMillis)源码看看是如