凡是学习Android开发的同学,就都会使用Handler,而且也看过很多人解释他们之间关系以及调用关系,但是都
不那么完整和精确,因此,我想写下这篇博客。
这里讲解的Handler都是在主线程中使用的Handler
1.Loop是什么时候被启动的
当我们new一个Handler的时候,实际上就初始化了一个Looper的实例,使用Looper.myLooper()方法,并且将
MessageQueue的引用赋值,mLooer.mQueue,
那么Looper是在什么时候启动的呢,是在app即进程被启动的时候就被启动(查看ActivityThread.Java代码的
main方法的代码),我的理解是MessageQueue是全局的,即
不论初始化多少个Handler,MessageQueue其实都是Looper中的mQueue,即同一个.(此处理解可能是错误,如果有
误,欢迎指正!)
2.Handler发送Message的具体过程
那么,当Handler发送Message的时候,实际上是将Message放到mQueue这个MessageQueue里面,Message中
有一个target变量即是Handler,这个很重要,表示这个Message是有哪个Handler发送出来的,那么响应的时候也是根
据这个变量找到相对应的Handler去处理,请查看Handler类中的
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)
该方法又调用MessageQueue类中的
enqueueMessage(Message msg, long when)
方法,此方法中有一个死循环贴在上面,监听是否有新的Message要处理,如果没有则休眠,调用nativeWake(),其
实这个方法维护一个Message对象的一个链表,将新来的Message赋值给Message的next变量,然后进入睡眠状态。
3.真正处理Message的过程
那么message又是怎么被处理的呢,我们一定要记得Loop类中的loop()方法一直在运行的,也是一个死循
环,当新的Message被MessageQueue挂在Message的next变量上后,loop()方法通过该语句
Message msg = queue.next(); // might block
判断出msg不为空,则调用下面的语句将message返回给Handler的handleMessage()方法处理掉
msg.target.dispatchMessage(msg);
以上我对Android源码关于Handler的理解,如果在面试时你这样给面试官解释一下,是不是很高大上啊。