美文网首页
关于Handler源码快速过一遍

关于Handler源码快速过一遍

作者: 雨来 | 来源:发表于2022-09-20 16:45 被阅读0次

    Handler引起的内存泄漏

    https://blog.csdn.net/m0_64420071/article/details/125445915
    引用链:
    activity->handler->message->messageQueue-> sMainLooper (sMainLooper是一个静态的)
    破坏message

    Handler new出来后做了什么?

    image.png image.png image.png

    参考视频:https://www.bilibili.com/video/BV1uS4y1d7j2?p=12&vd_source=6025b57821d61d2767e480ed622e9ca1

    Handler的四个有关类

    Handler 、Message、MessageQueue、Looper
    无论你是初级Android开发者还是高级开发者这个Handler的源码面试的时候肯定会被问到,或问得深与浅,我今天就简单的过一下Handler的源

    入口(存)

    handler.sendMessage()-> sendMessageAtTime

    image.png
    下面这个 equeueMessage 记着还是 Handler的方法
    image.png
    在上面这个方法中有个msg.target = this;
    注意:这个msg 就是 上面的四个关联类 Message 而 msg.target =this 是把 当前Handler 赋值给了 target
    image.png

    而 return queue.enqueueMessage(msg, uptimeMillis);
    又把 msg 传给了 MessageQueue

    image.png

    这里把消息通过 time 把消息排序 然后标记是否已经使用过了
    代码走到这里似乎走到尽头但什么也没有看到啊 我们再返回到前面
    上面的 MessageQueue 我们记着就是反msg存到 MessageQueue里了
    我们再看 sendMessageAtTime
    在这里给 MessageQueue 赋值了


    image.png

    上面的步骤是把msg 存到 MessageQueue里了

    messageQueue 是在 Hanlder的构造里赋值的 (是通过 Looper拿到的)


    image.png

    同时这里 mLooper = Looper.myLooper(); 来获取了mLooper
    既然 mQueue = mLooper.mQueue; Looper持有这个 MessageQueue 那么注意 这里就是开始取的入口了
    我们进入Looper里 的loop()方法


    image.png
    通过一个for循环 开始取在这里我们就 认为Loop()是一个传动带 一直里这里轮询从MessageQueue里面取数据

    回传数据

    在Looper 的loop()方法里 有下面的代码


    image.png

    还记得上面 msg.target 赋值给了 Handler了吗 也就是说 从存到取 都是Handler在统筹全局
    我们进入Handler的 dispatchMessage


    image.png
    image.png image.png

    总结一句话:

    从宏观层面讲 Handler 既是在发送消息也是在处理消息,在我们new Handler的时候 Looper和MessageQueue(因为 MessageQueue是在 Looper中初使化的 在主线程中New的时候是这样的 ,如果是子线程要自己调用 prepare 和loop() 方法) 已经准备好了,也就说new的时候 Looper 已经做好准备 如果有消息就开始取消息 加传给Handler

    一个线程中可以创建几个Handler?

    https://blog.csdn.net/Goals1989/article/details/125000828
    一个线程中可以创建多个Handler 但只会创建一个 MessageQueue和 Looper Looper是和线程关联的 但记住一点 谁发送谁接收 因为 有 equeueMessage的时候 把 当前Handler 赋值给了 msg.target = this (这个this就是 发送消息的Handler)

    相关文章

      网友评论

          本文标题:关于Handler源码快速过一遍

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