Android中使用Handler造成内存泄露
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
内存泄露的原因
-
在Java中,非静态内部类和匿名内部类都默认持有外部类的应用。
-
主线程的Looper对象的生命周期等于该应用程序的生命周期。
-
当使用内部类创建的Handler时,会默认持有外部类的引用,影响系统对Activity的回收,造成内存泄露。
解决
- 静态内部类+弱引用
- 静态内部类不默认持有外部类的引用。
- WeakReference持有Activity的引用,当GC扫描时,会及时回收。
- 外部类结束生命周期时,清空Handler内消息队列
- 当外部的Activity结束生命周期时,及时清除Handler里的消息。
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();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}