【发布时间】:2011-05-03 09:59:22
【问题描述】:
我有一个画廊小部件,其中包含大约适合(几乎)全屏图像。图像从 SD 卡加载,一次只能看到一张图像(滚动时接受重叠)。问题是,滚动浏览大约 35 张图像后,我得到了 OutOfMemoryError:位图超出 VM 预算。我认为画廊小部件会根据需要处理视图,但我想我要么弄错了,要么做错了什么。
我使用 CursorAdapter 加载数据,我注意到每当我滚动到新图像时,都会调用 newView() 和 bindView()。我认为这意味着原始视图已被处理,但内存不足问题似乎表明相反。我正在使用一个包含很多字段的 ViewHolder。
所以我的问题是:
- 与 CursorAdapter 一起使用时,图库小部件的行为是否与列表视图不同?
- 有没有办法强制回收和/或销毁视图? (或者我可能做错了什么)。
- 有关处理此方案的内存不足问题的其他建议?缩小尺寸并不是一个真正的选择,图库应该能够处理无限数量的图像(或至少两倍)。
【问题讨论】:
-
您是否在其他地方持有对 Views 的引用以防止它们被 GCed?
-
不,我很确定不是。我已经尝试尽可能地剥离它。任何陷阱的提示?什么会导致 convertView CursorAdapter.getView 为空?由于每次使项目可见时都会调用 newView,因此 convertView 每次都为空。我可能错了,但我会假设一个项目要么保留它的视图,要么为 GC 释放它。此外,如果我只是在前 8-10 个项目之间来回滚动,我永远不会得到 OutOfMemory(但仍然为每个项目调用 newView())。