Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak


1. 新建一个android工程,只有一个listview,通过MAT工具查看内存情况莫名其妙多了>200K内存空间(android4.4 Genymotion)。


hprof文件


2.通过右键“List Objects"->"with incoming references"可以查看"byte[281880]"谁使用。


Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak_第1张图片 with incoming references

3.原来是ListView中的mEdgeGlowBottom和mEdgeGlowTop在使用"byte[281880]",查看ListView源码,发现是在AbsListView中定义mEdgeGlowBottom和mEdgeGlowTop,用于overscroll时显示的效果。


Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak_第2张图片 AbsListView,setOverScrollMode函数

4.android4.4源码EdgeEffect类中加载资源R.drawable.overscroll_edge,R.drawable.overscroll_glow,至此"byte[281880]"的源头找到了。


Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak_第3张图片 android4.4源码EdgeEffect

5.找到资源源头,如何去掉"byte[281880]"内存占用呢?

1)AbsListView的setOverScrollMode函数是创建EdgeEffect对象的地方,只要想办法把mOverScrollMode设置为OVER_SCROLL_NEVER。

2)View的构造函数中会调用setOverScrollMode,所以需要在xml中设置属性,之前在代码中设置了,结果无效。


Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak_第4张图片 view构造函数调用setOverScrollMode

6.配置ListView属性。


Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak_第5张图片 ListView配置overScrollMode="never"

7.至此mGlow bitmap内存占用就没有了。如果不需要overScrollMode效果的话可以去掉。在android5.0源码中发现EdgeEffect实现方式变了,不是加载Drawable,而是使用Paint进行绘制的。


Android: Unknown “Bitmap” cause by 'mGlow' causing memory leak_第6张图片 android5.0源码EdgeEffect

总结:不需要的功能就disable,减少内存占用;能不使用图片的地方就不使用,用代码实现,减小内存占用,apk空间占用。

更多相关文章

  1. Android 图片的浏览、缩放、拖动和自动居中
  2. android 从matrix获取处理过的图片的实际宽度
  3. Android编译源码时出现的错误: “_FORTIFY_SOURCE”重定义
  4. Android 拍照 录音 拍视频 旋转 裁剪 压缩图片
  5. Android 4.0 Launcher2源码分析——启动过程分析
  6. Android中imageView图片放大缩小及旋转功能示例代码
  7. Android 将View 转化为bitmap 图片
  8. android RatingBar自定义图片
  9. Android RIL源码分析(2)

随机推荐

  1. Android(安卓)6.0(API 级别 23)在运行时请
  2. Android(安卓)studio 百度地图开发(9)只显
  3. Android(安卓)Patcher应用增量更新(App补
  4. Android拍照或从系统相册获取图片
  5. 番外篇 之 实现Unity和Android进行交互(基
  6. 如何让安卓(Android)子控件超出父控件的范
  7. Android进阶练习 - 高效显示Bitmap(高效加
  8. 《第一行代码——Android》封面诞生记
  9. [置顶] Android(安卓)使用Mockito测试业
  10. 【Android归纳决】回调机制在Android中的