安卓日记Handler的内存泄漏

Handler大家都在用,用来线程的通信,实现异步间的信息传递
handler有个小坑 不优化的话 会引起内存泄漏
要从handler机制说起,Android中UI线程也就是主线程建立时,会进行一个Looper.prepare()的方法,每个looper对应一个线程,这是一个类似轮询器的玩意儿,这个东西会不停地去轮询Messagequeue消息队列,取出处于队列头部的消息,发送给相应的线程
大体的一个机制就是这样,然后问题就出在了消息队列这一块,handler发送消息,不是说发送一个就完事,要不然也就用不到消息队列了,假设这样一个情况,消息队列中有五个消息,都是由子线程发送给主线程的,主线程在处理了两个消息之后被用户关闭了,这是很有可能的一个情况,activity关闭是关闭了 但是这个时候handler还持有着activaty的引用,这就会导致activity的内存回收不了,出现内存泄漏
具体优化方法如下 简单的加一个软引用

 static class LoadDataHandler extends Handler {
        private SoftReference activitySRF = null;

        public LoadDataHandler(MainActivity activity) {
            activitySRF = new SoftReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            // 因为Handler是异步的,存在退出当前类之后才接收到handler消息的情况,
            // 并且软引用持有的对象会在堆内存不足时存在被回收的可能,所以这里需要判空处理
            if (null == activitySRF || null == activitySRF.get()) {
                return;
            }
            switch (msg.what) {
                case 0: {
                    activitySRF.get().mUserNameTxt.setText("123");
                }
                break;
                default:break;
            }
        }
    }

你可能感兴趣的:(安卓日记Handler的内存泄漏)