Handler
handler引用链
handler ——》messageTag——》message——》messagequeue(looper 生命周期长)
activity——》hanlder
成员内部类相当于一个外部类的成员变量,可以访问外部类的所有成员变量和方法。
局部内部类:定义在方法里,比方法的范围还要小,是内部类中最少用的一种类型。 所以它会像局部变量一样不可以被public , protected, private, static修饰。并且它只能够访问final类型的局部变量这样的话,局部内部类也就只能在其所属的方法中被new,并且调用方法。
匿名内部类 匿名内部类在哪里被new,就会持有所在类对象的引用。
静态内部类与静态匿名内部类 static修饰的东西不在类的管辖范围之内。所以一旦被static修饰之后它不属于任何对象。所以这两种情况下是不会持有外部类引用的。
关于handler使用不当引发的内存泄漏自然也有了对应的解决方法,
1 要么把Myhandler搞成静态内部类。
2 或者另外立一个文件专门写一个Myhandler类。 这两种一个可以避免内部类持有外部类,另一个更粗暴地不让它当内部类。
要做就做彻底些,除了避免Handler持有Activity引发的内存泄露之外,在Activity结束的时候最好要remove一下发出去的那个message。
3.handler引用activity时 使用弱引用
单例模式引发的内存泄漏
单例的周期是和app的生命周期一致。并且整个app内只有一个这样的实例。
尽量使用applicationContext ,必须要有activity的时候可以使用弱引用 或者主动释放activity
非静态内部类的静态实例引发的内存泄漏。
内部类引用了activity 静态实例的周期非常长 容易长期持有acivity 导致内存泄露。
可以使用静态修饰 避免对activity的引用
非静态匿名内部类引发的泄露
可以使用静态修饰 避免对activity的引用
注册、反注册未成对使用引发的内存泄漏
在ondestroy反注册 之前注册过的对象避免泄露
资源对象没有关闭引发的内存泄漏
对资源对象使用完后进行 close(), destroy(),recycler(),release() 等操作
集合对象没有及时清理引发的内存泄漏
我们通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。如果集合是static、不断的往里面添加东西、又忘记去清理,肯定会引起内存泄漏。