直接在Activity中创建匿名内部类的Handler可能会造成内存泄漏
当你发送的消息没有处理时,占据着Activity的应用,当Activity页面销毁时,其引用还无法销毁,产生了内存泄漏
解决办法就是:
1,创建一个静态的内部类Handler
2,在静态内部类中弱引用MainActivity
3,在onDestroy()方法中销毁Handler的消息队列中的消息
有风险的代码:
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x0001:
tvTest.setText("Test");
break;
default:
break;
}
}
};
优化后的代码:
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
}
private static class MyHandler extends Handler {
private WeakReference<MainActivity> weakReference;
public MyHandler(MainActivity mainActivity) {
weakReference = new WeakReference<>(mainActivity);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x0001:
weakReference.get().tvTest.setText("Test");
break;
default:
break;
}
}
}
PS:IDE(Android Studio)会对这种情况进行警告, @SuppressLint("HandlerLeak")注解只是忽略掉并没有真正解决。正确方法应该是使用弱引用WeakReference。