1,从Handler到Looper
以上就是Handler机制的概要,每个部分都扮演着自己的角色
* Handler:发送消息和最后接收并处理消息
* Message:消息对象
* MessageQueue:消息队列(未被CPU处理的消息,都放这了)
* Looper:不断地循环MessageQueue,若有消息则执行,若无消息则阻塞
2,Looper一直循环,为什么不会死循环卡死,即:没有高频率占用CPU
1) Looper的调用
#ActivityThread.java::main()
public static void main(String[] args) {
...
Looper.prepareMainLooper();
// 创建ActivityThread
ActivityThread thread = new ActivityThread();
thread.attach(false);
...
Looper.loop(); // 消息循环
throw new RuntimeException("Main thread loop unexpectedly exited");
}
可以看出,Looper.loop()之后,就抛出异常,所以按照现象,loop()中应该是一个永真循环(死循环,永不退出)
2) loop()循环的实现
public static void loop() {
...
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
return;
}
msg.target.dispatchMessage(msg); // 分发消息,等待实现处理
msg.recycleUnchecked();
}
}
由Looper方法源码可以看出:Looper中执行一个永真循环,其中每次有消息则执行,无消息时,则阻塞。因此不会消耗大量CPU资源。情况类是一个休眠一秒的死循环和一个无限循环。情况1对cpu不会有太大影响,情况2则会大量消耗cpu资源。