消息队列的工作原理
消息队列在Android中指的是MessageQueue,Messageueue主要包含两个操作:插入和读取。读取操作本身会伴随着删除操作,插入与读取对应的方法为:enqueueMessage和next。其中,enqueueMessage的作用是往消息队列中插入一条消息,而next的作用是从消息队列中取出一条消息并将其从消息队列中移除。尽管MessageQueue叫消息队列,但是它的内部实现并不是用的队列而是一个单链表的数据结构来维护消息列表。
其中enqueueMessage源码:
从enqueueMessage的实现来看,主要操作其实就是单链表的插入操作
next源码:略(太多了,不截图了)
next是一个无限循环的方法,如果消息队列中没有消息,那么next方法就会一直阻塞在这里。
Lopper的工作原理
Looper在Android的消息机制中扮演着消息循序的角色,具体来说就是它会不停地从MessageQueue中查看是否有新消息,如果有新消息就会立刻处理,否则就一直堵塞在那里。在它的构造方法中,会创建一个MessageQueue即消息队列:
通过Looper.prepare()即可为当前线程创建一个Looper,接着通过Looper.loop()来开启消息循序:
同时,Looper提供prepareMainLooper方法,此方法是给主线程也就是ActivityThread创建Looper使用的。
由于主线程的Looper比较特殊,所以Looper也提供了getMainLooper()方法,通过它也可以在任何地方获取到主线程的Looper。
Looper也可以直接退出的:
quit():直接退出Looper
quitSafely():只是设定了一个退出标记,然后把消息队列中的已有消息处理完毕后才安全退出。