美文网首页
Handler源码学习(三) - MessageQueue源码

Handler源码学习(三) - MessageQueue源码

作者: Hoker_ | 来源:发表于2018-11-26 23:43 被阅读0次
Handler涉及的主要类,现在就剩下一个MessageQueue了,这里继续做源码阅读学习。

分析MessageQueue前,先看下他的成员变量:


MessageQueue成员变量

最重要的就是Message对象了,而Message是我们平时开发中,经常使用到的一个类,MessageQueue其本质上是一个链表,再看看Message的源码:


Message
主要需要注意的是Handler target 这个属性,从前面的文章可以知道,多个Handler是可以绑定到一个Looper的,那么Looper又是如何知道该执行哪个Handler的方法呢?就是通过target属性,他直接指向对于的Handler实例。
接着看下队列的入队操作:
入队操作

入队操作比较简单,就是按照when来给链表做了个排序,加上能唤醒队列。同时注意操作里头的synchronized (this){},说明消息队列是通过synchronized 来实现线程安全的。

继续看下出队操作:


出队操作

补充1: 在msg==null时,nextPollTimeoutMillis 被设置为-1,根据图里的描述,这时会阻塞队列,这也是队列为空时,next()方法会阻塞的原因。

    if (msg != null) {
        if (now < msg.when) {
            ...
        } else {
            ...
        }
    } else {
        // No more messages.
        nextPollTimeoutMillis = -1;
    }

补充2:如果觉得nextPollTimeoutMillis在for循环的结尾被置0难以理解,觉得每次循环都置0没有意义,这里就需要看下continue,循环会在没有idle任务时,会直接跳回循环kai't

      if (pendingIdleHandlerCount <= 0) {
           // No idle handlers to run.  Loop and wait some more.
           mBlocked = true;
           continue;
       }
总结:消息队列里的代码比其他的相对复杂些,但也就是一个链表各种被操作的事情。

相关文章

网友评论

      本文标题:Handler源码学习(三) - MessageQueue源码

      本文链接:https://www.haomeiwen.com/subject/jxqwqqtx.html