内存优化-内存泄漏处理handler

在我们编写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();
    }

具体内存泄漏的原因是非静态内部类会持有外部类的引用导致外部类无法销毁造成内存泄漏。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值