Volley网络图像视图 - 如何回收位图?

6

我在这个优秀的库中想要的是NetworkImageView能够回收位图。如果在方法NetworkImageView.onDetachedFromWindow中添加一些代码来回收位图,那它将会更加完美。目前,该库存在严重的内存泄漏问题和OOM异常,因为无法回收位图。不知道是否有计划集成这个概念,有了解的吗?


你是在ListView中使用它吗? - Mandar Limaye
1个回答

2
“回收位图”指的是在Bitmap对象上调用.recycle()方法。您为什么认为这会改善OOM情况呢?我承认,在Android 2.x时代,这确实是一个问题。位图存储在本地堆中,需要至少两次GC才能清理。调用recycle()有时可以改善情况。但自从Android 3.0以来,这已经不再是一个大问题了。
请注意,文档将此视为高级调用,通常不应使用:http://developer.android.com/reference/android/graphics/Bitmap.html#recycle() 至于您建议在onDetachedFromWindow()中回收位图,这似乎是一个坏主意。当View与窗口分离时,将调用此方法,不能保证View不会稍后重新附加。如果我们在onDetachedFromWindow()中回收位图,如果View稍后重新附加到Window,则会抛出异常。
此外,如果需要,我认为ImageView本身会处理它。
“记录一下,Volley 在OOM处理方面做得相当好,它会尝试在View的边界内缩放图像,并且只允许一个线程解码位图。” “我怀疑你遇到了其他问题,导致造成OOM…” “编辑后,根据Android开发人员的评论,我更新了我的回答。Volley不会自动按View的边界缩放图像,但它支持ImageRequest中的此功能(请参见构造函数:https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/ImageRequest.java,具有maxWidth和maxHeight)” “这意味着您需要修改NetworkImageView以使用正确的ImageRequest构造函数(您必须小心确保先测量视图)”

1
位图回收自 Android 3.0 开始已得到处理。关于 Volley 自动获取缩小的位图,这也是错误的。例如,尝试在不使用大量内存的情况下获取此图像(将 NetworkImageView 的宽度和高度设置为常数):https://github.com/danleech/simple-icons/diff_blob/d6f771d1e17a292681228d5bcdc624a60a18c93f/icons/android/android-4096.png?raw=true - android developer
1
你说得对。我仔细检查了源代码,虽然ImageRequest支持它,但默认情况下不使用 :-( 我已经更新了我的答案以反映这一点。谢谢。 - kwazi
1
你能否展示一下如何实现?这个库的样例比较少,我认为这会很有用。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接