小编总结一下最近面试遇到的关于Android消息机制的问题。
一 Loop.loop()死循环那为什么程序没有卡死
大家都知道 loop会无限循环MessageQueue中的Message实现UI的更新,但是死循环为什没有卡死线程。
Handler的机制是使用管道来实现的,MessageQueue没有消息时主线程会阻塞管道的读端,当MessageQueue又要处理的消息时,主线程会被唤醒。
大家需要理解Linux管道、epoll机制
二 如何确定消息来自哪个Handler
这个问题小编的理解是Message.target属性。
public static void loop() {
for (;;) {//无限循环
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
try {
msg.target.dispatchMessage(msg);//获取Message的Handler 然后调用Handler分发 处理消息
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
msg.recycleUnchecked();
}
}
三 子线程可以创建Handler吗?
答案是肯定的
一个线程可以有多个Handler,但是只有一个MessageQueue和Loop。
子线程创建Handler之前需要创建Looper。Handler可以实现子线程之间传递消息。
以上是我的解答,欢迎大家指正。