1

这是初学者最常问的问题之一,但不幸的是我仍然无法获得任何帮助。在一个活动中,我有一个 viewflipper,我以编程方式为图像分配图像视图(使用 for 循环将大约 100 个图像添加到 viewflipper)。可能是由于图像大小或由于图像数量过多导致位图出现 OutOfMemory 错误。我的问题是:

  1. 如果这是因为我的drawables占用了内存空间,有什么方法可以释放它们占用的空间?
  2. 垃圾收集会是这个原因吗?如果是这样,解决方案是什么?
  3. 由于我使用的是 viewflipper,有什么方法可以让我只能加载 viewflipper 的当前、上一个和下一个视图?这会帮助占用更少的内存吗?

如果我的问题令人困惑或无法理解,请告诉我。这对我来说是一个重要的话题,因为我在几乎所有的应用程序中都面临这个问题。

4

3 回答 3

4

为了避免,在清单中使用这个来获取大堆:

android:largeHeap="true"

几乎所有的问题解决方案都出现在这些与内存错误相关的链接上,希望其中一个可以解决您的问题:

错误记忆

使用 List、LinkedList 和 HashMap 的内存泄漏和内存不足错误

使用 LRU 缓存的内存泄漏和内存不足错误

使用磁盘 LRU 缓存的内存泄漏和内存不足错误

于 2013-10-09T06:49:27.897 回答
1

位图由本机内存处理。这意味着当 GC 收集位图的引用时,位图的内存不会立即被移除。要立即清除位图的内存,可以调用bitmap.recycle(). 至于 ViewFlipper,您将想要找到一种方法来手动卸载和重新加载向用户显示的图像。记得使用recycle(),不要试图显示已经被回收的位图。

希望这可以帮助 :)

于 2013-10-09T06:46:33.543 回答
0

现在这里发生的情况是,android 中的每个应用程序都分配了特定数量的堆大小,只有 20mb

位图占用大量内存,尤其是对于照片等丰富的图像

因此,每当您加载重图像或重图像数组时,它都会超过堆大小,并且 android 会自动关闭应用程序,因为它使用了超过分配的堆大小

阅读文档

因此,每当您处理大量图像时

  • 加载缩小版本
  • 异步处理图像
  • 然后最终将其显示在图像视图中
于 2013-10-09T09:57:57.443 回答