只在该轮循环内触发一次

当一次 MessageQueue.next() 被调用时,如果满足空闲状态(即 mMessages == null 或 msg.when > now),那么这一轮循环会只调用一批 IdleHandler 一次。IdleHandler 是每次空闲状态时触发不是只触发一次,在本轮 for (;;) 内的这次空闲状态期间,只调一次 IdleHandler,不会重复处理同一批。

说明:

条件 是否会触发 IdleHandler
队列第一次进入空闲状态 ✅ 会触发一次 IdleHandler
IdleHandler 执行过程中仍为空闲 ❌ 不会再触发该批 IdleHandler
下次消息处理完后再次进入空闲状态 ✅ 会再次触发(只要它返回 true)

为什么只在该轮循环内触发一次?

看看源码:

// pendingIdleHandlerCount 初始是 -1
if (pendingIdleHandlerCount < 0
        && (mMessages == null || now < mMessages.when)) {
    pendingIdleHandlerCount = mIdleHandlers.size();
}
  • pendingIdleHandlerCount 设置完之后就不再更新,直到本次 next() 方法退出为止;
  • 所以即使消息队列在这次空闲状态中一直空着,也不会重复调。

在一次 MessageQueue.next() 的空闲轮询中,IdleHandler 只会被调用一次。如果它返回 true,将在下一次再次进入空闲状态时再次调用。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器