for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
//省去其他代码,,,
如上代码,该循环是在 looper 类中的 loop 方法,相信大家都很熟,
轮询发现 messagequeue 中没有消息后,会退出该循环,返回 looper 方法,,,那么下次有新的消息后,从哪里重新启动这个 loop 循环?
1
miao1007 2015-11-10 23:17:35 +08:00
next 阻塞实际上是使用 native 层的 Unix 的 epoll 实现的。
nativePollOnce 读取管道,如果没有数据就阻塞 nativeWake 向管道中写入 W 数据 |
2
miao1007 2015-11-10 23:18:27 +08:00
你这个问题很好,我以前也问过[Looper 中的 loop 是如何实现阻塞的]( https://github.com/android-cn/android-discuss/issues/245)
|
3
kifile 2015-11-11 08:17:46 +08:00
你需要知道的是 Android 的主程序的真正入口并不是 Activity 或者 Application ,而是 ActivityThread.在 ActivityThread 中有一个 main 方法, public static 的哦,他就是主入口,在那里对 Looper 的 mainLoop 做了初始化,并进入死循环。
|
4
Registering OP |
5
kifile 2015-11-11 09:37:52 +08:00 1
可是这个特殊处理的目的是为了退出循环啊,要知道一般而言 Looper 中的 MessageQueue 对象只能是通过 Handler 传递消息进去, Handler 中有机制保证他始终不为空。
而为空的情况就是调用了 Looper 中的 quit 方法,然后会调用 MessageQueue 中的 removeAllFutureMessagesLocked ,这个方法里才会将下一个 message 置为 null,导致循环结束。 |