内存问题加载应用程序的图像

时间:2012-10-14 23:19:28

标签: android

描述背景,因为我可能只是对问题采取了一种可怕的方法 - 自学。

我正在为Android编写一个应用程序,并在默认AVD上进行测试,默认AVD设置为WVGA800,具有512'设备柱塞尺寸'和240'抽象LCD密度'。

我有一些图像,我将它们放入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)。事实上,之前的应用程序曾经通过翻转它来制作每个图像的几个副本,但仍然没有耗尽空间。当前的应用程序在初始加载时失败 - 在很多事情发生之前。

有人能指出我可能出现的问题吗?我如何解决它,或者提一下我的方法是否错误(从示例中自我教导)

3 个答案:

答案 0 :(得分:2)

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

  • 如果您计划支持所有设备,请将所有资源放入xhdpi文件夹。特别是背景
  • 文件大小!=内存大小

答案 1 :(得分:1)

是的,这是一个非常常见的问题。所以在旧版本的Android OS中,位图被加载到本机内存而不是JVM中。垃圾收集过程确实有2个周期。一个用于清除JVM中的内存,另一个用于清除本机内存中的内存(用于位图)。如果您想使用较旧的设备,则需要通过回收位图Bitmap.recycle()或致电System.gc()

来处理这种情况

您可能会遇到两个问题: 1.您还有其他未经回收的位图。 你真的因为单个图像太大而内存不足。 (确保其他图像已正确回收或gc&d;以便它不会增加内存占用量)。在这种情况下,你无能为力。

另外,正如mehmet建议的那样,你可以阅读this

答案 2 :(得分:1)

请记住以下几点:

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