Handler,Looper,MessageQueue简析

Handler的构造函数:
通过Looper.myLooper()获取Looper对象
检测Looper对象是否为null (主要是看是否调用过Looper.prepare())
从Looper对象中获取MessageQueue
Handler的sendMessage():
最终调用sendMessageAtTime(),实质内容就是通过enqueueMessage()方法把msg放入MessageQueue中

MessageQueue的enqueueMessage()方法:
就是一个链表的数据结构,把最新传入的msg插入到链表尾部
MessageQueue的next()方法:
一个死循环
nativePullOnce()会阻塞(当没有消息(没有消息,nextPullTimeoutMillis=-1,在native中依据nextPullTimeoutMillis来决定是否返回),或者没有到发送时间时阻塞)
唤醒时机有2个:
队列中加入新的msg,也就是enqueueMessage()时候,需要判断是否需要唤醒
超时

Looper解析:
构造函数:创建MessageQueue实例, 并通过Thread.currentThread()获取并绑定当前线程
prepare()方法:创建Looper对象,并通过ThreadLocal保存
myLooper()方法:从ThreadLocal中获取Looper对象.若没有调用过prepare()方法,则返回null

loop()方法:
仍然会通过myLooper()获取looper对象,并判断是否为空.
工作在死循环中.
通过queue.next()获取msg,这里会阻塞.
判断msg是否为空来决定是否退出死循环,因此Looper的quit()方法,就是调用MessageQueue的quit()方法,而MessageQueue的quit()方法就是清除所有的msg.
msg.target就是handler的实例了,调用其dispatchMessage(msg)方法,交由handler来处理事件.

prepareMainLooper()方法:创建主线程的Looper,不应该手动调用.在ActivityThread中调用
getMainLooper()方法:返回应用的主线程Looper

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章