【问题标题】:Volley NetworkImageView - how to recycle bitmaps?Volley NetworkImageView - 如何回收位图?
【发布时间】:2013-06-28 08:17:37
【问题描述】:

我在这个奇妙的库中想念的是它不会在 NetworkImageView 中回收位图。如果在 NetworkImageView.onDetachedFromWindow 方法中调用了某个地方的回收,那将是完美的。目前,该库存在未回收位图并遇到 OOM 异常的严重泄漏。有人知道是否有整合这个概念的计划吗?

【问题讨论】:

  • 你在 ListView 中使用它吗?

标签: java android android-imageview android-volley


【解决方案1】:

“回收位图”是指在 Bitmap 对象上调用 .recycle()。

为什么您认为这会改善您的 OOM 情况?虽然我承认曾几何时,Android(即 2.x)确实遇到过这个问题。位图存储在本机堆中,需要(至少)2 次 GC 传递才能清理。调用 recycle() 有时会改善这种情况。

自 Android 4.x3.0 以来,这已经不是什么问题了。

请注意,文档认为这是一个通常不应使用的高级调用: http://developer.android.com/reference/android/graphics/Bitmap.html#recycle()

关于您在 onDetachedFromWindow() 中回收位图的建议,这似乎是个坏主意。当 View 从窗口分离时调用此方法,不能保证以后不会重新附加 View。如果我们要在 onDetachedFromWindow() 中回收 Bitmap,如果 View 重新附加到 Window,我们会抛出异常。

此外,如果需要,我认为 ImageView 本身会处理它。

为了记录,Volley 通过尝试在 View 的边界内缩放图像并且一次只允许一个线程解码位图来很好地处理 OOM。

我怀疑您还有其他导致 OOM 的问题...

------------ 编辑 ---------------

在android开发者的评论评论之后,我更新了我的答案。 Volley 不会在 View 的范围内自动缩放图像,但它在 ImageRequest 中确实支持它(请参阅构造函数:https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/ImageRequest.java with maxWidth 和 maxHeight)

这意味着您必须修改 NetworkImageView 以使用正确的 ImageRequest 构造函数(您必须小心确保首先测量视图)

【讨论】:

  • 从 android 3.0 开始处理位图回收。关于 volley 自动获取缩小的位图,这也是错误的。例如,尝试在不占用大量内存的情况下获取此图像(将 networkImageView 的宽度和高度设置为恒定):github.com/danleech/simple-icons/diff_blob/…
  • 你是对的。我仔细检查了来源..虽然 ImageRequest 支持它,但默认情况下不使用它:-( 我已经更新了我的答案以反映这一点。谢谢
  • 你能举个例子吗?这个库的样本不多,我认为它可能很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多