写内存泄漏的文章很多,再把别人的抄一遍也没意思。
先总结一下,再说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

更多相关文章

  1. 在android上实施不会OOM的内存管理方案
  2. Android(安卓)性能优化之内存泄漏检测以及内存优化(上)
  3. 避免内存泄漏
  4. Android工程引用另外一个工程的正确/错误方法
  5. Android(安卓)强弱指针
  6. 引用 android string.xml文件中的整型和string型代替
  7. Android(安卓)国际化
  8. Android开发基础—通过匿名内部类实现按钮点击事件
  9. Android(安卓)—— Handler进阶(未完持续)

随机推荐

  1. Chrome OS和Android的三大不同点
  2. android http上传文件
  3. android开发——显式intent
  4. OneAPM 试用测评
  5. 刚学习android安卓,哪里有源码例子可以下
  6. Android实现自定义相机系列(1)—自定义vi
  7. 研究Android即时聊天、实时语音通话、实
  8. 初学Android应用程序——资源文件、文字
  9. Android绘图机制与处理技巧(三)——Android
  10. Android(安卓)NDK编译带STL的 C/C++ 程序