关于Handler和内存泄漏

Handler可能引发内存泄漏的原因

首先要了解两点:
1. 非静态内部类会持有外部类的this引用。为什么呢?
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this访问外部类的成员。1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象(this)的引用;2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为内部类中添加的成员变量赋值;3在调用内部类的构造函数初始化内部类对象时,会默认传入外部类的引用。
2. java的垃圾回收机制中,如果一个对象处于“可达”状态,则不会回收。所以当活动销毁的时候,如果子线程的任务还没完成,就会有Handler->Activity这样的引用链,导致Activity不能被GC回收。

如何解决呢

将Handler声明为静态的内部类即可,然后如果要对Activity持有的对象引用进行操作,构造时传入activity的弱引用即可。
直接上代码:
这是反面教材(sdk直接都提示了)
关于Handler和内存泄漏

正确的写法应该是这样:
关于Handler和内存泄漏

顺便复习下git

这篇博客是在程序用正确方式写完之后才想起来写的,所以之前反面教槽的图是怎么截的呢?鸣谢git。因此顺便复习下git的知识:
首先,通过git status命令发现最新的修改并未提交
关于Handler和内存泄漏
其中有三个文件,另外两个是IDE相关的文件(其实可以设置忽略掉保证工作区的干净,这里先不说)提交下刚刚修改的fragment。
关于Handler和内存泄漏
然后重点来了,要先用log命令看下提交记录,并且记录下最新这次提交的key(图中黄色字符串,等下回退版本之后回到未来全靠这个key)
关于Handler和内存泄漏
然后用git reset –hard HEAD^命令回退到上一个版本
关于Handler和内存泄漏
然后内容就变成了刚刚完成网络功能的那个版本(可能造成内存泄漏),截个图,然后回到未来。版本的key只要写前面几个字符就可以,git会自动匹配
关于Handler和内存泄漏