【问题标题】:Android BitmapShader memory leakAndroid BitmapShader 内存泄漏
【发布时间】: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。 (至少,不明确)

标签: android memory-leaks


【解决方案1】:

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

【讨论】:

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