java message queue_Android 消息机制之 MessageQueue 深入源码分析 [ 五 ]

上一章学习了消息机制中的 Message 与 Message 的消息对象池. 本章继续学习消息机制中 MessageQueue 消息队列的相关概念.

尽管 MessageQueue 叫消息队列, 但是它的内部实现却并不是用的队列, 实际上它是通过一个单链表的数据结果来维护消息列表. (单链表在插入与删除上很有优势)

MessageQueue 主要包括两个操作, 插入和读取. 但是读取操作本身会伴随着删除操作. 插入和读取对应的方法分别是 enqueueMessage 与 next.

enqueueMessage 作用是往消息队列中插入一条数据.

next 作用是从消息队列中取出一条消息并将其从消息队列中移除. next 是一个无限循环的方法, 如果消息队列中没有消息, 那么 next 方法会一直阻塞, 当有新消息来的时候, next 会返回这条消息并将其从链表中移除.

消息队列中所有的 Message 都是按照时间从前往后有序排列的.

1. 成员变量

private final boolean mQuitAllowed

用于表示消息队列是否可以被关闭, 主线程的消息队列不可关闭.

private long mPtr; // used by native code

用于保存 native 代码中 MessageQueue 的指针.

Message mMessages

在 MessageQueue 中所有的 Message 都是以链表的形式组织在一起的, mMessage 保存了消息链表的头部. 也可以说它就是链表的本身.

private final ArrayList mIdleHandlers = new ArrayList();

当 Handler 线程处于空闲状态的时候(MessageQueue 没有其他 Message), 可以利用它来处理一些事物, 该变量就是用于保存这些空闲时候需要处理的事物.

private IdleHandler[] mPendingIdleHandlers;

保存将要被执行的 Idlehandler

private boolean mQuitting;

标识 MessageQueue 是否正在关闭.

private boolean mBlocked;

标识 MessageQueue 是否阻塞

private int mNextBarrierToken;

在 MessageQueue 中有一个概念叫做障栅, 它用于拦截同步的 Message, 阻止这些消息被执行. 只有异步的 Message 才会放行. 障栅本身也是一个 Message, 只是它的 target 为 null, 并且 arg1 属性用于区分不同的障栅, 所以该变量就是用于不断累加生成不同的障栅.

2. IdleHandler 接口

在 MessageQueue.java 811 行 中, 有一个内部接口为 IdleHandler.

public static interface IdleHandler {

boolean queueIdle();

}

这是一个回调接口, 当线程空闲时可以利用它来处理一些业务.

boolean queueIdle()

当消息队列内所有的 Message 都执行完之后, 这个方法会被调用.

返回 true, IdleHandler 会一直保持在消息队列中.

返回 false, 会执行完改方法后移除 IdleHandler.

需要注意的是, 当消息队列中还有其他的 Delay Messag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值