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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值