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
下面这个 equeueMessage 记着还是 Handler的方法
image.png
在上面这个方法中有个msg.target = this;
注意:这个msg 就是 上面的四个关联类 Message 而 msg.target =this 是把 当前Handler 赋值给了 target
image.png
而 return queue.enqueueMessage(msg, uptimeMillis);
又把 msg 传给了 MessageQueue
这里把消息通过 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)
网友评论