在我们编写handler的时候如果定义的handler非静态的handler Android studio就会给出如下的警告
This Handler class should be static or leaks might occur
意思是我们定义handler的时候应该定义一个静态的handler否则可能发生内存泄漏。那如何用正确的姿势写handler呢。
下面是我的一段代码
private static class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
这样的话我们的异常就不会再被提示了那接下来问题来了我们要在handler的处理上添加对控件上赋值该如何处理呢如果将控件设置成static的那activity肯定回收不了资源了必然更会内存泄漏。
不兜圈子了直接上代码
private static class MyHandler extends Handler {
private SoftReference<MainActivity> softReference;
private MainActivity activity;
public MyHandler(MainActivity mainActivity) {
softReference=new SoftReference<>(mainActivity);
}
@Override
public void handleMessage(Message msg) {
activity=softReference.get();
if (activity!=null) {
//处理我们的UI
activity.tv_main.setText((String)msg.obj);
}
super.handleMessage(msg);
}
}
不要以为这样就结束了最后一点在 onDestroy() 方法中添加如下处理
private MyHandler handler = new MyHandler(MainActivity.this);
@Override
protected void onDestroy() {
handler.removeCallbacksAndMessages(null);
super.onDestroy();
}
具体内存泄漏的原因是非静态内部类会持有外部类的引用导致外部类无法销毁造成内存泄漏。