Volley NetworkImageView - 如何回收位图?

时间:2013-06-28 08:17:38

标签: java android android-imageview android-volley

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

1 个答案:

答案 0 :(得分: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()中回收Bitmap,这似乎是一个坏主意。当视图与窗口分离时调用此方法,不能保证以后不重新附加视图。如果我们要在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,其中包含maxWidth和maxHeight)

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