您的位置:首页 > 其它

主线程消息循环机制本质

2016-09-01 17:26 183 查看
1.主线程消息循环:ActivityThread主线程的入口方法:main
main() {
Looper.prepareMainLooper(); // 创建Looper,并添加到线程中
Looper.loop(); // 死循环查询,取出Message,执行Message绑定的Handler的handleMessage
}

Looper.prepareMainLooper-->
// Looper.java
public static final void prepareMainLooper() {
prepare(); // 创建一个Looper并加入到线程局部变量中:sThreadLocal.set(new Looper());
setMainLooper(myLooper()); // 将prepare创建的Looper对象取出,并保存到变量mMainLooper = looper;
}

// E
Looper.loop();-->
// Looper.java
public static final void loop() {
Looper me = myLooper(); // 获取当前线程对应的Looper,也就是prepare保存进去的looper
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // might block.如果消息队列为空则休眠,有数据插入到消息队列则唤醒

if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}

msg.target.dispatchMessage(msg); // 调用Message.handleMessage
msg.recycle();
}
}
}

小结:
1.涉及到类
Looper:引用MessageQueue
MessageQueue:引用多个Message.本质是一个队列,按照未来即将超时时间来排序队列中的每个元素
Message
Handler:把Message插入到MessageQueue中

2.E.Looper.loop是引擎,本质是一个死循环,不断查询MessageQueue中是否有Message,如果有超时的Message,则取出来调用Message绑定的Handler的
handlerMessage函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: