【问题标题】:Android gallery widget with out of memory issue内存不足问题的 Android 图库小部件
【发布时间】:2011-05-03 09:59:22
【问题描述】:

我有一个画廊小部件,其中包含大约适合(几乎)全屏图像。图像从 SD 卡加载,一次只能看到一张图像(滚动时接受重叠)。问题是,滚动浏览大约 35 张图像后,我得到了 OutOfMemoryError:位图超出 VM 预算。我认为画廊小部件会根据需要处理视图,但我想我要么弄错了,要么做错了什么。

我使用 CursorAdapter 加载数据,我注意到每当我滚动到新图像时,都会调用 newView() 和 bindView()。我认为这意味着原始视图已被处理,但内存不足问题似乎表明相反。我正在使用一个包含很多字段的 ViewHolder。

所以我的问题是:

  1. 与 CursorAdapter 一起使用时,图库小部件的行为是否与列表视图不同?
  2. 有没有办法强制回收和/或销毁视图? (或者我可能做错了什么)。
  3. 有关处理此方案的内存不足问题的其他建议?缩小尺寸并不是一个真正的选择,图库应该能够处理无限数量的图像(或至少两倍)。

【问题讨论】:

  • 您是否在其他地方持有对 Views 的引用以防止它们被 GCed?
  • 不,我很确定不是。我已经尝试尽可能地剥离它。任何陷阱的提示?什么会导致 convertView CursorAdapter.getView 为空?由于每次使项目可见时都会调用 newView,因此 convertView 每次都为空。我可能错了,但我会假设一个项目要么保留它的视图,要么为 GC 释放它。此外,如果我只是在前 8-10 个项目之间来回滚动,我永远不会得到 OutOfMemory(但仍然为每个项目调用 newView())。

标签: android memory gallery


【解决方案1】:

图像尺寸是多少?它会导致问题。试试这个来减小图像尺寸:

BitmapFactory.Options o2 = new BitmapFactory.Options();
//Best to use powers of 2.
o2.inSampleSize=2;
BitmapFactory.decodeStream(new FileInputStream(f), null, o2);

【讨论】:

  • 要减小图像尺寸,您实际上需要增加样本大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多