一般来说,内存泄漏都是因为泄漏对象的引用被传递到该对象的范围之外,或者说内存泄漏是因为持有对象的长期引用,导致对象无法被 GC 回收。为了避免这种情况,我们可以选择在对象生命周期结束的时候,解除绑定,将引用置为空,或者使用弱引用。
1、由于 Context 导致内存泄漏。使用 Application Context 代替 Activity Context,避免长期持有 Context 的引用,引用应该和 Context 自身的生命周期保持一致。
2、由于非静态内部类、匿名内部类导致内存泄。它们会隐式的持有外部类的引用,一不小心长期持有该引用就会导致内存泄漏,使用静态内部类来代替它们。
3、Handler 导致内存泄漏。原因和第二点一样,同样使用静态内部类的实现方式,同时对需要引用的对象/资源采用弱引用的方式。
4、EventBus导致内存泄漏。EventBus 的单例特性,会长期持有注册对象的引用,一定要在对象生命周期结束的时候,接触注册,释放引用。同样对于系统提供的一些成对出现的方法,我们也需要成对的调用,例如 BroadcastReceiver 的 registerReceiver( ) 方法和 unRegisterReceiver( ) 方法。
5、线程导致内存泄漏。我们经常会执行一些长期运行的任务,避免在这些任务中持有 Activity 对象的引用,如果持有了引用的话,我们应该在对象生命周期结束的时候,释放引用。
6、属性动画导致的内存泄漏,用完记得cancel()掉;如果是自定义View中含有属性动画,在
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
//关闭线程和动画
cancelAnimation();
}
7、TypedArray使用记得调用recycle()。