当前位置:   article > 正文

Android 9.0 源码_机制篇 -- 全面解析 Handler 机制(原理篇)下_安卓9有messagequeue吗

安卓9有messagequeue吗

MessageQueue 中有两个比较重要的方法,一个是 enqueueMessage 方法,一个是 next 方法。enqueueMessage 方法用于将一个 Messag e放入到消息队列 MessageQueue 中,next 方法是从消息队列 MessageQueue 中阻塞式地取出一个 Message。在 Android 中,消息队列负责管理着顶级程序对象(Activity、BroadcastReceiver等)以及由其创建的所有窗口。

#七 创建MessageQueue

   MessageQueue(boolean quitAllowed) {
       mQuitAllowed = quitAllowed;
       // 通过 native 方法初始化消息队列,其中 mPtr 是供 native 代码使用
       mPtr = nativeInit();
   }
  • 1
  • 2
  • 3
  • 4
  • 5

###next()

   Message next() {
       final long ptr = mPtr;
       if (ptr == 0) {     // 当消息循环已经退出,则直接返回
           return null;
       }

       // 循环迭代的首次为 -1
       int pendingIdleHandlerCount = -1; // -1 only during first iteration
       int nextPollTimeoutMillis = 0;
       for (;;) {
           if (nextPollTimeoutMillis != 0) {
               Binder.flushPendingCommands();
           }

           // 阻塞操作,当等待 nextPollTimeoutMillis 时长,或者消息队列被唤醒,都会返回
           nativePollOnce(ptr, nextPollTimeoutMillis);

           synchronized (this) {
               // Try to retrieve the next message.  Return if found.
               final long now = SystemClock.uptimeMillis();
               Message prevMsg = null;
               Message msg = mMessages;
               if (msg != null && msg.target == null) {
                   // 当消息 Handler 为空时,查询 MessageQueue 中的下一条异步消息 msg,则退出循环
                   do {
                       prevMsg = msg;
                       msg = msg.next;
                   } while (msg != null && !msg.isAsynchronous());
               }
               if (msg != null) {
                   if (now < msg.when) {
                       // 当异步消息触发时间大于当前时间,则设置下一次轮询的超时时长
                       nextPollTimeoutMillis = (
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/320158
推荐阅读
相关标签
  

闽ICP备14008679号