Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak
16lz
2021-01-23
Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak
1. 新建一个android工程,只有一个listview,通过MAT工具查看内存情况莫名其妙多了>200K内存空间(android4.4 Genymotion)。
2.通过右键“List Objects"->"with incoming references"可以查看"byte[281880]"谁使用。
3.原来是ListView中的mEdgeGlowBottom和mEdgeGlowTop在使用"byte[281880]",查看ListView源码,发现是在AbsListView中定义mEdgeGlowBottom和mEdgeGlowTop,用于overscroll时显示的效果。
4.android4.4源码EdgeEffect类中加载资源R.drawable.overscroll_edge,R.drawable.overscroll_glow,至此"byte[281880]"的源头找到了。
5.找到资源源头,如何去掉"byte[281880]"内存占用呢?
1)AbsListView的setOverScrollMode函数是创建EdgeEffect对象的地方,只要想办法把mOverScrollMode设置为OVER_SCROLL_NEVER。
2)View的构造函数中会调用setOverScrollMode,所以需要在xml中设置属性,之前在代码中设置了,结果无效。
6.配置ListView属性。
7.至此mGlow bitmap内存占用就没有了。如果不需要overScrollMode效果的话可以去掉。在android5.0源码中发现EdgeEffect实现方式变了,不是加载Drawable,而是使用Paint进行绘制的。
总结:不需要的功能就disable,减少内存占用;能不使用图片的地方就不使用,用代码实现,减小内存占用,apk空间占用。
更多相关文章
- Android 图片的浏览、缩放、拖动和自动居中
- android 从matrix获取处理过的图片的实际宽度
- Android编译源码时出现的错误: “_FORTIFY_SOURCE”重定义
- Android 拍照 录音 拍视频 旋转 裁剪 压缩图片
- Android 4.0 Launcher2源码分析——启动过程分析
- Android中imageView图片放大缩小及旋转功能示例代码
- Android 将View 转化为bitmap 图片
- android RatingBar自定义图片
- Android RIL源码分析(2)