走进Android之Handler第三节 MessageQueue中的消息是如何被送到handleMessage(msg)中的

本小节我们来看下。已经被插入到MessageQueue中的消息,是如何到大handleMessage(msg)中的。管理消息队列中的消息,是有Looper进行负责的。


loop()函数用来管理该线程的消息队列。函数体中先是通过Looper.myLooper()来获取与当前线程相关联的looper对象。如果当前线程没有关联的looper对象就会抛出一个运行时异常。重点关注下面的那个死循环。如果loopOnce(me,ident,thresholdOverride)的返回值是false 将会跳出死循环。

我们点进去。看看上面这个函数 作了什么操作


函数体里面代码很多。我们挑重点的看。

先是通过Message msg = me.mQueue.next()  调用MessageQueue.next()函数 取出消息队列中的当前消息的下一个消息。如果不存在下一个消息。那么就会返回false.最终结果就是导致退出Looper.loop()中的那个死循环。

如果返回的msg不为空。那么就意味着。消息队列中的当前消息 还存在下一个消息。

就会执行这段代码 msg.target.dispatchMessage(msg);


第一步先是判断了该Msg的callback字段是否为空。不为空的话就调用Handler的handleCallback(msg)函数

为空的话。再判断Handler的mCallback是否为空。

不为空的话。就调用Handler中Callback接口中的handleMessage(msg).然后退出。

通常的话。我们都是调用最下面的那个handleMessage(msg)



这样一通分析下来。我们就明白了。只要消息队列中还存在下一条信息。那么handleMessage()这个函数就一直会被调用。直到消息队列中没有下一条消息了。

你可能感兴趣的:(走进Android之Handler第三节 MessageQueue中的消息是如何被送到handleMessage(msg)中的)