一、Handler内存泄漏原因
handler发送的消息在当前handler的消息队列中,如果此时activity finish掉了,那么消息队列的消息依旧会由handler进行处理,若此时handler声明为内部类(非静态内部类),我们知道内部类天然持有外部类的实例引用,那么就会导致activity无法回收,进而导致activity泄露。
二、Handler内存泄漏几种情况
1、隐式引用
public class CameraVerifyActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private class MyHandle extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
2、显示引用
public class CameraVerifyActivity extends Activity {
MyHandle myHandler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myHandle = new MyHandle(this);
}
private class MyHandle extends Handler {
public MyHandle(Activity activity) {
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
3、Handle调用Runnable
public class CameraVerifyActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
class MyRunnable implements Runnable {
private View view;
public MyRunnable(View view) {
this.view = view;
}
public void run() {
// ... do something with the view
}
}
}
三、Handler内存泄漏解决方法
1、针对1(添加static):
public class CameraVerifyActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private static class MyHandle extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
2、针对2(添加弱引用):
public class CameraVerifyActivity extends Activity {
MyHandle myHandler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myHandle = new MyHandle(this);
}
private static class MyHandle extends Handler {
private WeakReference<CameraVerifyActivity> reference;
MyHandle(CameraVerifyActivity activity) {
reference = new WeakReference<CameraVerifyActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
3、同2一样
四、Handler内存泄漏总结
1.使用static 修饰的handler,但是一般会弱引用activity对象,因为要使用activity对象中的成员
2.单独定义handler,同样可以弱引用activity
3.使用内部类的handler,在onDestroy方法中removeCallbacksAndMessages