Android中使用Handler造成内存泄露
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
当使用内部类创建Handler的时候,Handler对象会隐式持有外部类对象,通常Handler操作会伴随着一个耗时操作,当外包的Activity关闭时,被Handler引用的Activity并不会被立即回收而是被引用,导致Activity无法被销毁回收,从而导致内存泄漏。
内存泄露的危害
对于Android应用来说,就是你的用户打开一个Activity,使用完之后关闭它,内存泄露;又打开,又关闭,又泄露;几次之后,程序占用内存超过系统限制,导致OOM(内存溢出),程序出错。
解决
可以使用static
和WeakReference
解决回收问题
- 静态类不持有外部类的对象,所以你的Activity可以随意被回收
- 弱引用对象就会在被GC检查到时回收掉
static class MyHandler extends Handler {
WeakReference<Activity> reference;
public MyHandler(Activity activity) {
reference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Activity activity = reference.get();
if (activity != null) {
loadData();
}
}
}