Android BitmapShader 内存泄漏

Posted

技术标签:

【中文标题】Android BitmapShader 内存泄漏【英文标题】:Android BitmapShader memory leak 【发布时间】:2014-04-06 19:20:48 【问题描述】:

我的 android 应用程序出现内存泄漏,导致 outOfMemory 异常。我用 MAT 做了内存分析,结果是“android.graphics.BitmapShader”的 480 个实例,由“”加载占用 42,611,792 (81.71%) 个字节。我使用了很多 Bitmaps 和 Drawable,但在我的整个项目中我从不使用 BitmapShader。我想如果我从不实例化任何一个对象,我怎么能减少对象的数量或回收它们。 谢谢大家

【问题讨论】:

可能某些组件或视图隐式使用位图着色器...您在项目中使用的是哪种标准或第三方自定义视图?当您不清除对内存消耗对象的所有引用时,通常会发生此类泄漏。 感谢您回答@Salauyou。我主要使用 ListView(水平和垂直)、ImageView 和 VideoView。此外,我正在使用 PullToRefreshListView 并从这个 repo [github.com/shontauro/android-pulltorefresh-and-loadmore] 中进行了一些自定义。在那个类中也没有使用 BitmapShader。 (至少,不明确) 【参考方案1】:

您使用的是ProgressBar 吗?我还注意到我的应用程序在 MAT 中有大量 BitmapShader,其中大部分都由 ProgressBar 实例保留。我使用了支配树视图,然后右键单击 BitmapShader 实例,选择“合并最短路径到 GC 根”,然后选择“排除弱引用”。出现在层次结构中的某处是 ProgressBar。

【讨论】:

天哪!我正在使用很多带有自定义可绘制动画的 ProgressBars。进度怎么可能是占用我大部分应用程序内存的东西?!那么,我们应该用什么来告诉用户等待呢?图像视图?!太疯狂了……我会和 MAT 核对一下,但我想你真的说到点子上了…… 所以,你是对的。 BitmapShader 由 ProgressBar 实例保留。但我们不能消除进度!有什么想法吗? 我没有使用大量的 ProgressBars。所以修复其他内存泄漏对我来说就足够了。我不认为在您的应用程序中使用大量 ProgressBars 是一个问题,除非您保留的内容超出了您的需要。在给定的屏幕上,您不应该需要超过一两个。 @Allison,您能否说明一下您是如何正确地垃圾收集 ProgressBar 实例的?

以上是关于Android BitmapShader 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Android学习笔记进阶16之BitmapShader

android 使用BitmapShader实现圆形以及放大镜效果

Android技术分享|Android 中部分内存泄漏示例及解决方案

Android内存泄漏查找和解决

Android内存优化三:内存泄漏检测与监控

Android ValueAnimator --内存泄漏