用MAT解决GridView引起的内存泄漏
来源:互联网 发布:龙视安网络摄像头协议 编辑:程序博客网 时间:2024/06/05 22:40
用户反馈页面中用到了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。
0 0
- 用MAT解决GridView引起的内存泄漏
- 解决由Handler 引起的内存泄漏
- GridView内存泄漏解决
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
- weak_ptr解决shared_ptr环状引用所引起的内存泄漏
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏问题
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
- weak_ptr解决shared_ptr环状引用所引起的内存泄漏
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
- weak_ptr解决shared_ptr环状引用所引起的内存泄漏
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏问题
- weak_ptr解决shared_ptr环状引用所引起的内存泄漏
- Android —— 解决MVP引起的内存泄漏
- InputMethodManager引起的内存泄漏问题分析与解决
- AfxBeginThread引起的内存泄漏
- C# 索引器
- JDBC事务
- Wrong committed revision number: -1
- Dos 以del为例的参数与作用(/f/s/q)
- 浅析session、cookie原理机制
- 用MAT解决GridView引起的内存泄漏
- 高性能mysql之前缀索引
- jsp页面跳转
- 手游客户端设计思路整理
- C++ new失败的处理
- 未能正确加载Microsoft.Data.Entity.Design....
- 存储【2】 RAM ROM cache 区别
- Android studio 中Button上的string 自动转为大写字串解决方法
- C#异步编程总结