只在该轮循环内触发一次
当一次 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,将在下一次再次进入空闲状态时再次调用。