内存泄漏的几种情况
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等,解决方法就是记得关闭和注销;一些库用到了注册也要解注册。
网友评论