前言
每次面试,handler基本上被问到的概率超过百分之八九十。同学们有咩有想过为什么面试官特别喜欢问handler?
这是因为handler能延伸出很多的面试点。不信的话,我们来看:
请说说Handler、Looper、MessageQueue
Handler机制在Android中是一个非常重要的知识点,在我们的平常开发中也是经常使用到的。在Android的面试中Handler机制更是必考的题目,而且题目也很单一:请说说Handler、Looper、MessageQueue之间的关系。这个问题无论是我去面试还是我面试别人,都会问到的一个问题。如果你遇到了这个问题,你只是简单的说一下它们是什么什么关系,那是远远不够的。这道题考察的无非就是你对Handler机制的实现和它的工作原理的了解。下面我们就通过Handler机制的工作流程图和源码来详细分析Handler实现细节和工作原理。
下面想看Handler的工作流程图:(第一次画图,有点丑,凑合着看吧)
因为Handler的主要作用就是线程切换,所以在图中我把Handler线程变化也画了出来。从这张图我们能看出几点信息:
1、Handler负责消息的发送和处理:Handler发送消息给MessageQueue和接收Looper返回的消息并且处理消息。
2、Looper负责管理MessageQueue:Looper会不断地从MessageQueue取出消息,交给Handler处理。
3、MessageQueue是消息队列(实时上它是用链表实现的),负责存放Handler发送过来消息。
4、一个Looper对应一个线程(自己所在的线程,如:线程B)。Looper的loop()方法运行在自己所在的线程(线程B)中,当Handler在线程A发送一条消息存放到MessageQueue时,Looper的loop()方法在线程B把消息取出来,并交给Handler处理,所以Handler的处理消息的方法是运行在Looper所在的线程(线程B)的。由于多个线程之间共享内存空间,所以Handler可以在线程A把消息存放到MessageQueu