简介
在Android开发中,我们经常需要在工作线程中进行夸线程通讯实现UI操作,这时就会使用到Handler。
Handler、Looper、MessageQueue、Message关系介绍
-
Handler
Handler是跨线程通讯的媒介。可以通过Handler实现Message发送与消费Meesage等操作。 -
Looper
Looper是个无限循环的滚轮,不断地从MessageQueue中取出Message,并派发给Handler。 -
MessageQueue
MessageQueue是消息队列,主要用于消息入队与出队操作 -
Message
Message是消息主体,携带消息内容。
工作流程
- 在主UI线程启动的时候,系统就创建了UI线程Looper对象。Looper内包含了MessageQueue,在创建Looper时就会创建MessageQueue。
- 创建Handler时会获取当前线程的Looper对象,Handler可以发送Message到MessageQueue
- Looper不断的从MessageQueue中取出Message并派发给对应的Handler,Handler收到消息并执行对应的业务代码逻辑,这就完成了消息的消费
特性
-
Looper具有唯一性
ThreadLocal是用于保存线程信息的一个类,在Looper创建的时候会从ThreadLocal获取线程的Looper,如果不为空就会抛出异常,这样就保证了Looper的唯一性。
Q&A
-
Handler中发送消息线程安全吗?
线程安全。 - 为什么消息循环不会卡死
..... - obtainMessage与new Message的区别:
obtainMessage()会从消息池中获取到Message,重复new Message效率低。