本文共 2584 字,大约阅读时间需要 8 分钟。
一、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 WeakReferencereference; MyHandle(CameraVerifyActivity activity) { reference = new WeakReference (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转载地址:http://asxab.baihongyu.com/