OnClickListener是匿名内部类为什么不导致android内存泄漏

写内存泄漏的文章很多,再把别人的抄一遍也没意思。
先总结一下,再说OnClickListener是匿名内部类为什么不导致android内存泄漏的问题。
MemoryLeak原因就是,生命周期长的类实例(A)所引用的生命周期短的类(B)实例,在B已经结束生命周期了需要释放时没有释放还被A引用着,导致B不能被GC就出现了内存泄漏。根本原因就是很老套很经典的这句话:没有被释放
总结起来无非就是几大点:
1 静态变量:如将一个activity实例传递给一个static申明的变量。
2 单实例:单实例引用某些对象(如引用activity,或者activity的context)。
3 数组:例如数组中包含activity,activity走了ondestroy要被销毁了,但是ArrayList中仍然有引用导致不能回收。
4 非静态内部类:非静态内部类会对外部类有引用,外部类生命周期结束后可能还被内部类引用。
5 cursor、stream未关闭。
基本是以上5种,解决方法,网上很多。

  • 思考:

最有意思的,就是4 非静态内部类导致内存泄漏,我非常好奇,我们经常用的OnClickListener是一个非静态的内部类,但是基本不会导致内存泄漏,为什么?
我们根据这个原则:没有被释放 来分析:
1 首先OnClickListener是匿名内部类,肯定会对外部类有引用。
2 而这个new出来的OnClickListener被谁引用呢?当然是将它setOnClickListener的那个view(姑且叫他viewC)。
3 当activity被销毁时,它所包含的所有view也将释放各自所有引用的对象,这当然包括viewC,也会去释放OnClickListener。
4 这样OnClickListener虽然有引用activity,但是OnClickListener不再被任何对象引用,按照GC算法不能到达根,就能被回收了。
怎么样?很神奇是不是?道理就是这样的。

https://stackoverflow.com/questions/5002589/memory-leakage-in-event-listener

你可能感兴趣的:(android)