主线程消息循环机制本质

来源:互联网 发布:lomo拍立得知乎 编辑:程序博客网 时间:2024/06/14 13:57
1.主线程消息循环:ActivityThread主线程的入口方法:mainmain() {Looper.prepareMainLooper(); // 创建Looper,并添加到线程中Looper.loop(); // 死循环查询,取出Message,执行Message绑定的Handler的handleMessage}Looper.prepareMainLooper-->// Looper.javapublic static final void prepareMainLooper() {        prepare(); // 创建一个Looper并加入到线程局部变量中:sThreadLocal.set(new Looper());        setMainLooper(myLooper()); // 将prepare创建的Looper对象取出,并保存到变量mMainLooper = looper;    }// ELooper.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:引用MessageQueueMessageQueue:引用多个Message.本质是一个队列,按照未来即将超时时间来排序队列中的每个元素MessageHandler:把Message插入到MessageQueue中    2.E.Looper.loop是引擎,本质是一个死循环,不断查询MessageQueue中是否有Message,如果有超时的Message,则取出来调用Message绑定的Handler的handlerMessage函数


1 0
原创粉丝点击