handler

作者: GoodWen | 来源:发表于2021-07-08 10:18 被阅读0次

    在activity中 new handler 的时候,就已经创建了主线程的 looper 对象(在那里面呢,在activityThread的 main 方法,在应用启动之时),activity 执行 sendMessage 的时候(也就是存入消息的时候,发送消息的时候),都会调用 enqueueMessage 放入 压入 存入 消息 到 消息队列(MessageQueue)中,消息队列中有个全局的变量叫做 mMessage。 在从队列中取出消息的时候 是通过 looper 的 loop 方法 轮询 来取出一个消息,先进先出,后进后出的一个方式,接着在 messageQueue中执行 next 方法 取出一个一个的message 对象,最终调用 handler 的 dispatchMessage 方法,接着是调用 new handler 重写的方法 handlerMessage

    在应用启动之时:
    activityThread 中 的 main 方法 调用 Looper.prepareMainLooper()方法
    创建全局唯一一个主线程 looper 对象

    调用 prepare()方法 在 sThreadLocal 中 设置 主线程为 key 主线程的 looper 为值

    new looper 中 创建了一个 messageQueue 对象()记得消息队列是在 looper对象中创建的,在构造方法里 是作为 looper对象里面的一个属性 是全局唯一一个主线程消息队列

    在 activity 中 new handler 的时候
    首先是 重写了 handleMessage 方法 然后在构造方法中 以主线程为 key 得到 全局唯一的主线程 looper 然后把 looper 中的 messageQueue 对象 赋值给 handler 中的 mQueue

    在发送消息的时候
    调用sendMessage方法,看源码最终调用的都是 enqueueMessage 方法 将消息压入消息队列 最终调用的是 queue 的 enqueueMessage 方法将消息压入消息队列 然后将 message 赋值给 queue 中的全局变量 message 而在 looper 对象中 有一个全局变量 queue 这里相当于给他赋值了 同时在这之前 将自身赋值给 message 中的 属性 handler 方便在 取出消息后 将消息进行消费掉

    在取消息的时候
    依然要回到 activityThread 的 main 方法中 里面有个 looper.loop 方法 这是一个轮询器 一直在跑 因为里面有个死循环 先是 从 sThreadLocal 中去拿到 looper 当然还是 以主线程 为key 取出 主线程looper 再去拿到 messageQueue 对象 再调用 messageQue 的 next 方法 取出下一个 消息 也就是 message 对象 因为前面已经将 message 对象中的 handler属性和 发送消息的handler 关联 所以在 message中 调用 handler的 dispatchMessage 方法 回调重写的 handlerMessage 方法 完成异步操作

    问题及答复


    1.png

    相关文章

      网友评论

          本文标题:handler

          本文链接:https://www.haomeiwen.com/subject/sxpzultx.html