6

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

4

1 回答 1

2

通过“回收位图”,我假设您的意思是在 Bitmap 对象上调用 .recycle() 。

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

自 Android 4.x 3.0 以来,这不再是一个问题。

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

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

此外,如果需要,我认为 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 构造函数(您必须小心确保首先测量视图)

于 2013-07-16T00:45:04.333 回答