【hadler机制】
https://www.jianshu.com/p/ba46bad5af67
https://www.cnblogs.com/dendai-05/p/6945159.html
https://www.jianshu.com/p/b63cdff5e661
什么是Handler机制?
Handler机制是AndroidSDK提供的一个非常重要的处理异步消息的机制,主要是由Handler、Looper、Message和MessageQueue组成,Handler只是消息处理机制的一部分。
- Message:消息(分为硬件产生的消息和软件产生的消息)。
- MessageQueue:消息队列,主要是向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池中的消息(MessageQueue.next)。
- Handler:主要功能是向消息池发送消息(Handler.sendMessage)和处理消息(Handler.handleMessage)。
- Looper:不停的循环执行(Looper.loop),从MessageQueue中取出Message并发送给Handler。
分析上述各部分:
[1] Message
什么是硬件消息和软件消息呢?硬件消息就是我们滑动触摸点击按钮等等,软件消息就是我们主动new Message发送出去的。Message实现了Parcelable接口封装消息数据,所以他是存在于内存中的。一个实体(类)如果需要封装到消息中去就必须实现这一接口。
[2] MessageQueue
相当于一个容器,消息池。上述看到了.next应该猜到是链表形式,实际上确实是单链表维护,在插入和删除上有优势。在其next()中会无限循环,不断的判断是否有消息,有就返回这条消息并移除。
[3] Looper
Looper创建的时候会创建一个MessageQueue,它们两个是一一对应的关系。调用Looper.loop()的时候消息循环开始,不断地调用MessageQueue的next()方法,当有消息就处理,否则就堵塞在next()方法中。loop()跟MessageQueue的next()一样都是死循环(源码可见for(;😉)。退出时调用Looper.quit(),它会调用MessageQueue的quit()方法,此时next会返回null,然后loop()方法也跟着退出。
[4] Handler
在主线程构造Handler,new Handler()里调用了Looper.myLooper()这个方法,这个方法是获取当前线程的Looper的。在其他线程调用sendMessage()时主线程的MessageQueue会插入一条Message,然后被Looper使用,在Looper的loop()中通过回调 msg.target.dispatchMessage(msg);发送给Handler。Handler跟Looper的关系是多对一。
https://www.jianshu.com/p/592fb6bb69fa
我们再来总结下Handler消息机制主要的四个类的功能
- Message: 信息的携带者,持有了Handler,存在MessageQueue中,一个线程可以有多个
- Hanlder: 消息的发起者,发送Message以及消息处理的回调实现,一个线程可以有多个Handler对象
- Looper: 消息的遍历者,从MessageQueue中循环取出Message进行处理,一个线程最多只有一个
- MessageQueue: 消息队列,存放了Handler发送的消息,供Looper循环取消息,一个线程最多只有一个
一段Looper的源码片段:
**解释完各部分的分工那来总结一下他们之间的关系:**Handler负责发送消息(Message)到MessageQueue中,Looper负责循环的接收MessageQueue中的消息通过回调方法返还给Handler自己本身。