Android常见内存泄漏及正确写法(相对)

概念:内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。

单例

这种应该属于新手最容易出现的错误,因为类中会封装一些需要用到Context的方法,于是想当然的就把Activity或者Activity的Context直接传入,结果就是这个单例一持有传入的Activity无法得到释放.

public class Singleton { private Context mContext; private volatile static Singleton instance = null; private Singleton(Context mContext) { this.mContext = mContext; } public static Singleton getInstance(Context mContext) { if (instance == null) { synchronized (Singleton.class) { instance = new Singleton(mContext); } } return instance; } }

解决方案

  • 传入的Activity使用mContext.getApplicationContext()</br></br></br>

匿名内部类

这是Java中方便又恐怖的一个地方。因为你不注意就可以导致内存泄漏比如下面这个。首先内部有一个100秒的延迟操作,同时这个匿名内部类最终指向是Activity导致finish后
GC依然认为它是有引用的所以导致无法回收。

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.postDelayed(runable,100000); } });

解决方案

  • 匿名类改为静态内部类</br></br></br>

Handler Thread TimerTask

这种发生内存泄漏问题与上面有类似之处比如:

handler.postDelayed(runable,100000);

一段延迟代码让Activity的任务没有结束结果无法回收

解决方案

  • 在Destory中记得赋为null或停止任务并且使用静态修饰</br></br></br>

集合类、静态集合类

使用集合类最容易长期持有对象,如果不对集合Remove或者Clear则会持有到集合的生命周期结束。

解决方案

  • 及时的remove 和 clear</br></br></br>

监听器、各种连接、注册 及解决

有些监听器生命周期很长。�需要remove 当你不知道它生命周期时最简单的看看有没有删除监听方法如果有就使用至少不会错,一些连接比如数据库没有关闭也会造成泄漏,在finally中要记得关闭,注册与解除一定是成对出现的记住这个就够了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,650评论 0 8
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,237评论 2 7
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 802评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,916评论 25 708
  • ###集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变...
    RunningTeemo阅读 581评论 0 0