Android开发中的内存泄漏

内存泄漏的几种情况

1.使用了非静态匿名内部类对象(如handler、线程)

在Activity中直接使用new handler();因为非静态内部类会隐式持有外部类实例,导致activity不能回收;
解决方法:
使用静态的handler

private static class MyHandler extends Handler {
        private WeakReference<Context> reference;

        public MyHandler(Context context) {
            reference = new WeakReference<>(context);
        }

        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = (MainActivity) reference.get();
            if (activity != null) {
                activity.mTextView.setText("");
            }
        }
    }
    WeakReference<Activity> weakActivity;
    weakActivity =new WeakReference<Activity>(activity);
    Activity activity = weakActivity.get();
    if(activity !=null){
        // do your stuff with activity here}
    }

或者可以:

public abstract class MyHandler<T extends Context> extends Handler {
    private WeakReference<T> reference;
    public MyHandler(T context) {
        reference = new WeakReference<>(context);
    }
    @Override
    public void handleMessage(Message msg) {
        T activity = reference.get();
        if (activity != null) {
            handleMessage(activity, msg);
        }
    }
    public abstract void handleMessage(T activity, Message msg);
}

线程:
也是一样使用静态内部类;

2.单例持有了有生命周期的对象的引用

解决方法:单例的生命周期和应用一样长,所以持有了短生命周期的对象(如Activity)会导致该对象无法回收。可以使用ApplicationContext,或者弱引用。关于使用的场合可以参考difference-between-activity-context-and-application-context

3.资源打开用完了未关闭

如cursor,bitmap,BraodcastReceiver等,解决方法就是记得关闭和注销;一些库用到了注册也要解注册。

4.检测内存泄漏

leakcanary
MAT

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

推荐阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,664评论 0 8
  • ###集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变...
    RunningTeemo阅读 589评论 0 0
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,429评论 0 12
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,257评论 2 7
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 818评论 0 5