用MAT解决GridView引起的内存泄漏

本文介绍了解决Android中GridView批量上传图片导致的内存泄漏问题。通过分析引用关系并逐步尝试不同方法,最终找到有效回收资源的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户反馈页面中用到了gridview批量上传图片,发现有内存泄漏,也没在网上找到关于gridview图片回收的方法,只有自己慢慢摸索,android studio导了一个又一个hprof,用MAT挨个分析,只要还存在图片类型对象又另外想办法,最后终于找到了回收的方法。
先看看代码:

        mGridView=(GridView) findViewById(R.id.gridview);
        mGridViewDatas = new ArrayList<>();
        Bitmap addBitmap = Utils.getInstance().readBitmap(getApplicationContext(), R.drawable.add_pic);
        mGridViewDatas.add(0, addBitmap);
        mGridViewAdapter = new GridViewAdapter(getApplication(), mGridViewDatas, MAX_UPLOAD_PIC);
        mGridView.setAdapter(mGridViewAdapter);

mGridViewDatas 是用来保存bitmap的list,与gridview控件通过adapter相连。一开始在avtivity的ondestory是只是mGridView = null,用MAT分析内存的情况是:
这里写图片描述
用神器GIMP打开Bitmap就能看到是gridview中图片没有回收,查看引用关系:
这里写图片描述
发现是由于mGridViewDatas 还持有图片的引用,于是在onDestory中加了一行:

mGridViewDatas.clear();

再次运行抓取hprof,得到如下结果:
这里写图片描述
对象变了,但仍然没有释放,查看引用关系:
这里写图片描述
看到一个pictureLayout对象,这是包含gridview的layout,尝试过

pictureLayout.removeAllViews();

没用,后来又尝试从gridview入手:

mGridView.removeAllViews();

查看注释才发现gridview不支持这个方法,最后换成这样:

mGridView.removeAllViewsInLayout();

运行app,抓hprof分析,得到结果:
这里写图片描述
没有bitmap,也没有imageview,gridview资源被回收。

总结

gridview在回收的时候要清除数据对象和view系统才能回收图片资源:

        //消除内存泄漏
        mGridView.removeAllViewsInLayout();
        mGridView = null;
        mGridViewDatas.clear();

网上没有找到现成的方法只有自己慢慢琢磨,正好再熟悉下MAT。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值