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

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]"谁使用。


with incoming references

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


AbsListView,setOverScrollMode函数

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


android4.4源码EdgeEffect

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

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

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


view构造函数调用setOverScrollMode

6.配置ListView属性。


ListView配置overScrollMode="never"

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


android5.0源码EdgeEffect

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,928评论 25 709
  • 2021期待与你一起共事,点击查看岗位[https://www.jianshu.com/p/6f4d67fa406...
    闲庭阅读 16,739评论 0 75
  • 在年輕的路上死去 請不要將我埋葬 我的孤魂依舊在天地遊蕩 沒有人知道風的惆悵 選擇在路上死去 就不奢望地久天長 請...
    喜宁123阅读 111评论 0 4
  • 如何掌握程序语言 王垠写的比较不错的文章 分享·zhenjunluo· 于3 年前发布 · 最后由DouO于3 年...
    喜欢就可以阅读 404评论 0 6
  • 古城依旧 琴瑟回梁,却染多少愁。 一眼回眸,却话多少故。 绫纱蹁,青丝跹。 古城东,是相念。 故城依旧 琵琶绕耳,...
    浮华烟雨终成空阅读 193评论 0 2