谈动态代理在解决内存泄露中的妙用

本文探讨了Android中动态代理如何应用于解决内存泄露问题,通过分析典型的服务绑定内存泄露案例,提出利用动态代理创建代理对象,以避免回调导致的长时间引用,从而确保资源能被正确释放。
摘要由CSDN通过智能技术生成

内存泄露在Android开发中很常见,每次产品上线之前都要集中解决内存泄露问题,有的问题很明显,有的藏的很深,解决起来要颇费一番功夫,不过总的思路都是一样,就是切断引用链,让资源在该释放的时候能被及时释放。

我们先看一个内存泄露的案例:

public class ServiceManager {
   

    public static void bindService(final BindResponse response) {
        Context context = MyApplication.getInstance();

        Intent intent = new Intent(context, MyService.class);

        context.bindService(intent, new ServiceConnection() {

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
                response.onServiceBinded();
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
                response.onServiceUnbinded();
            }

        }, Context.BIND_AUTO_CREATE);
    }
}

这是个很典型的服务绑定,传入了一个回调,在服务绑定和解绑时调用这个回调。乍一看不会有什么问题,其实会有内存泄露的风险。我们看Activity中如何调用的,如下:

public class TestActivity extends Activity {
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        ServiceManager.bindService(new BindResponse() {

            @Override
            public void onServiceBinded() {
                // TODO Auto-generated method stub

            }

            @Override
            public void onServiceUnbinded() {
                // TODO Auto-generated method stub

            }

        });
    }
}

这里简单得不能再简单了,但是会让这个Activity有内存泄露,资源被某个无形的手长期持有而不能释放。我们现在就来给这只背后的手揪出来,导出内存用MAT查看,如下:

这里写图片描述

可以看到这里Activity被ServiceManager持有,然后一路转手到mLoadedApk,最后BOSS

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值