0

描述背景,因为我可能对这个问题有一个糟糕的方法——自我学习。

我正在为 android 编写一个应用程序,并在默认 AVD 上对其进行测试,默认 AVD 设置为 WVGA800,“设备内存大小”为 512,“抽象 LCD 密度”为 240。

我有一些图像,我将它们放入 drawable-hdpi 中。该文件夹中有 458 KB(不是 MB)的图像。所有图像均为PNG格式。

问题是,当我尝试加载最大的图像(用于背景)时,它会抛出:java.lang.OutOfMemoryError 这是加载图像的调用:

BitmapFactory.decodeResource(status.getResources(), R.drawable.background);

这与我加载其余图像(总共 33 个)的方式相同。

这对我来说很有意义,它会在最大图像上耗尽内存,但我的文件夹总大小为 458 KB,所以我不希望设备上设置的 512 MB Ram 用完。

我从不卸载任何图像,我保持它们加载,并根据需要使用。我之前写了一个不同的应用程序,其中我的图像总大小为 563 KB,总共 82 个图像,我没有这个问题(使用相同的 AVD)。事实上,以前的应用程序过去常常通过翻转每个图像来制作几个副本,并且仍然没有用完空间。当前应用程序在初始加载时失败 - 在发生很多事情之前。

有人可以指出问题可能是什么吗?以及我如何解决它,或者可能提到我的方法是否错误(通过示例自学)

4

3 回答 3

2

我会给你一些关于我如何设法减轻这个问题的提示

  • 如果您计划支持所有设备,请将所有资源放入 xhdpi 文件夹。尤其是背景
  • 文件大小!= 内存大小
于 2012-10-15T09:44:39.887 回答
1

是的,这是一个很常见的问题。因此,在旧版本的 android OS 中,位图被加载到本机内存而不是 JVM。垃圾收集过程实际上有 2 个周期。一个用于清除 JVM 中的内存,另一个用于清除本机内存中的内存(用于位图)。如果您想在旧设备上工作,您需要通过回收位图Bitmap.recycle()或调用来处理这种情况System.gc()

您可能会遇到两个问题: 1. 您还有其他未回收的位图。2. 你的内存真的用完了,因为那张图片太大了。(确保其他图像被正确回收或 gc'd 以便它不会增加内存占用)。在这种情况下,您无能为力。

另外,正如 mehmet 建议的那样,您可以阅读此内容

于 2012-10-14T23:28:58.100 回答
1

请记住以下几点:

  • 您的应用程序有内存限制(这取决于 android 版本)。您不会获得所有设备内存。我认为第一个 android 版本的内存限制为 16mb。
  • 文件的大小并不代表内存中位图的大小。例如 32 位 ARGB 位图将占用32*width*height
  • 如果您正在处理大图像,请先缩放它们。计算您需要的大小(这可能是您的大小ImageView)并加载调整大小的位图副本。您可以使用BitmapFactory.Options
于 2012-10-14T23:31:04.223 回答