美文网首页
MessageQueen

MessageQueen

作者: 冰鑫925 | 来源:发表于2017-05-17 16:31 被阅读148次

    MessageQueue.IdleHandler可以用来在线程空闲的时候,指定一个操作;有点类似Handler.postDelayed(Runnable r, long delayMillis),都是在将来的某一个时间
    执行一个操作。
    不过,使用IdleHandler的好处在于可以不用指定一个将来时间,只要线程空闲了,就可以执行它指定的操作。
    比较适合那种需要在将来执行操作,但是又不知道需要指定多少延迟时间的操作。

    Paste_Image.png

    只要使用Looper.myQueue().addIdleHandler(xxx)就可以了。这样,在线程空闲,也就是activity创建完毕之后,它会执行queueIdle里面的代码。
    返回值的含义在代码里面注释说明了,
    true,表示needKeep,也就是保留,当queueIdle执行完毕之后,不会移除这个IdleHandler
    false,表示这个IdleHandler不需要保留,也就是只需要执行一遍。

    android里面消息机制的关键在于Looper.loop()方法,因为它把一个简单的线程做成了一个死循环,这样才能保证持续的响应消息。

    Paste_Image.png

    loop()方法可以看出,它是一个死循环
    for(;;){...}

    这段代码的关键是 Message msg = queue.next(); // might block
    这是去获取下一个消息,从注释可以看出,它是一个可能阻塞的方法,底层是使用epoll机制来实现的,这个暂且不提。
    我们继续跟踪queue.next();

    Paste_Image.png

    底层获取一个消息,nativePollOnce(mPtr, nextPollTimeoutMillis); 这个先不分析。
    当获取到消息之后,正常逻辑是得到一个正常的消息,然后返回给Looper去执行这个消息。
    但是,如果返回的消息等于null的话,那么就暂时不会返回,而是继续往下面执行
    然后,它首先判断pendingIdleHandlerCount的个数,这个IdleHandler就是我们最开始的时候添加的IdleHandler。
    如果有IdleHandler的话,就执行。
    逐个调用IdleHandler的queueIdle方法,
    keep = idler.queueIdle();
    然后根据返回值决定要不要keep这个IdleHander,如果返回false,也就是不保留的话,就执行移除IdleHandler的操作,这样下次线程再空闲的时候,就不会调用这个IdleHandler了。

    Paste_Image.png

    http://bbs.51cto.com/thread-1094228-1.html

    ![Uploading Paste_Image_172165.png . . .]

    相关文章

      网友评论

          本文标题:MessageQueen

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