Android内存优化-方式十一:避免Handler导致的内存泄露

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaoming168/article/details/88947017

在这里插入图片描述
在这里插入图片描述

它默认是可以使用外部类的成员变量的,这样也佐证了我们所说的它会隐式的持有外部类的引用;
这时候如果子线程使用handler将message消息发送到messageQueue中并等待执行的过程过长(具体异步消息相关的内容可以查看:http://blog.csdn.net/qq_23547831/article/details/41697039),这时候activity已经执行finish方法;
那么我们希望的是activity被执行onDestory方法,然后activity相关的各种资源,组件都被销毁掉,但是由于handler隐式的持有activity的引用,那么activity就无法被回收,activity相关的资源与组件也无法被回收–即内存已经泄露。

在这里插入图片描述

这样的话,handler对象由于是静态类型无法持有外部activity的引用,但是这样Handler不再持有外部类的引用,导致程序不允许在Handler中操作activity中的对象了,这时候我们需要在Handler对象中增加一个对activity的弱引用;
.
.
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yaoming168/article/details/88947017