赞
踩
MessageQueue 中有两个比较重要的方法,一个是 enqueueMessage 方法,一个是 next 方法。enqueueMessage 方法用于将一个 Messag e放入到消息队列 MessageQueue 中,next 方法是从消息队列 MessageQueue 中阻塞式地取出一个 Message。在 Android 中,消息队列负责管理着顶级程序对象(Activity、BroadcastReceiver等)以及由其创建的所有窗口。
MessageQueue(boolean quitAllowed) {
mQuitAllowed = quitAllowed;
// 通过 native 方法初始化消息队列,其中 mPtr 是供 native 代码使用
mPtr = nativeInit();
}
###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 = (
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。