美文网首页
Android开发中的内存泄漏

Android开发中的内存泄漏

作者: Ulez | 来源:发表于2017-10-13 16:15 被阅读6次

内存泄漏的几种情况

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开发中的内存泄漏

      本文链接:https://www.haomeiwen.com/subject/ocbzyxtx.html