自定义 Handler 时如何有效地避免内存泄漏问题?

解决方案:
step 1.自定义的静态handler
step 2.可以加一个弱引用
step 3.还有一个主意的就是当你activity被销毁的时候如果还有消息没有发出去 就remove掉吧
step 4.removecallbacksandmessages去清除Message和Runnable 加null 写在生命周的ondestroy()就行

  将非静态内部类修改为静态内部类(静态内部类不会隐式持有外部类)

  当使用软引用或者弱引用的时候,MainActivity难道很容易或者可以被GC回收吗?
  GC回收的机制是什么?当MainActivity不被任何对象引用
  虽然Handler里面用的是软引用/弱引用,但是并不意味着不存在其他的对象引用该MainActivity
  当MainAcitivity都被回收了,静态内部Handler中的弱/软引用也就被回收了,handler也没有存在的意义了
 private static class MyHandler extends Handler {
        //private Main2Activity mainActivity;//直接持有一个外部强引用,会引起内存泄露
        private WeakReference mainActivity;//设置软引用保存,当内存一发生GC的时候就会回收

        public MyHandler(Main2Activity mainActivity) {
            this.mainActivity = new WeakReference(mainActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Main2Activity main = mainActivity.get();
            if (main == null || main.isFinishing()) {
                return;
            }

            switch (msg.what) {
                case 0:
                    //加载数据
                    //MainActivity.this.a;//有时候确实会有这样的需求,需要引用外部类的资源,怎么办
                    int b = main.a;
                    break;
            }

        }
    }

你可能感兴趣的:(自定义 Handler 时如何有效地避免内存泄漏问题?)