- Handler:作用就是发送与处理信息,如果希望Handler正常工作,在当前线程中要有一个Looper对象
- Message:Handler接收与处理的消息对象
- MessageQueue:消息队列,先进先出管理Message,在初始化Looper对象时会创建一个与之关联的MessageQueue;
- Looper:每个线程只能够有一个Looper,管理MessageQueue,不断地从中取出Message分发给对应的Handler处理!
Handler运行机制是需要MessageQueue、Looper、Handler三者的相互协调工作,但是实际上这三者就是一个整体,只不过我们在开发的过程中只是接触到了Handler一个而已。Handler的主要作用就是将一个任务切换到指定的线程中去执行。
MessageQueue通常翻译为“消息队列”,它内部存储了一组数据,以队列的形式对外提供插入和删除操作。虽然被称之为消息队列,但是实际上它的数据结构却是采用的单链表的结构来存储消息列表(单链表在插入和删除操作上效率比较高)。 存储数据的队列。
Looper可以理解为消息循环,因为MessageQueue只是一个存储消息队列,不能去处理消息,所以需要Looper无限循环的去查看是否有新的消息,如果有的话就处理消息,否则就一直等待(阻塞)。Looper.prepare()方法为当前线程创建一个Looper,之后用Looper.loop()方法来开启消息循环,Looper.loop()主要功能就是不断从MessageQueue中读取消息,交给消息的target属性的dispatchMessage去处理。
对于Looper的总结可以如下:
- 与当前的线程绑定,保证一个线程只有一个Looper实例,同时一个Looper实例只有一个MessageQueue
- loop方法不断的从MessageQueue中去取消息,交给消息的target属性的dispatchMessage去处理
面试常问,仅做记录,摘抄自下面两个帖子
https://www.cnblogs.com/fuck1/p/5513412.html
https://blog.csdn.net/u011619211/article/details/51442264