Android Handler MessageQueue Loop Message之间的关系以及消息发送响应流程

凡是学习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的理解,如果在面试时你这样给面试官解释一下,是不是很高大上啊。



你可能感兴趣的:(android)