2012-10-14 49 views
0

描述背景,因为我可能只是有一个可怕的方法来解决问题 - 自我学习。内存问题为应用程序加载图像

我正在为android编写一个应用程序,并测试它默认的AVD,它被设置为WVGA800,512'设备RAM大小'和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)。实际上,之前的应用程序曾经通过翻转它来制作每个图像的几个副本,但仍未耗尽空间。目前的应用程序在初始加载时失败 - 在很多事情发生之前。

有人能指出我该问题可能是什么?我怎么能解决它,或者可能提及我的方法是错误的(例如自我教导)

+1

你应当已经阅读:http://developer.android.com/training/displaying-bitmaps/index.html – mehmetminanc

+0

什么是你的资产的尺寸是多少? – dumbfingers

回答

1

是的,这是一个很常见的问题。所以在旧版本的android操作系统中,位图被加载到本机内存中,而不是JVM。垃圾收集过程确实有2个周期。一个清除JVM中的内存,另一个清除本机内存中的内存(对于位图)。如果你想在旧设备上工作,你将需要要么回收您的位图Bitmap.recycle()或致电System.gc()

来处理这种情况有,你可能会击中了两个问题:1。 你有其他的位图是未回收。 2.你真的内存不足,因为那个单一的图像太大了。 (确保其他图像正确回收或gc'd,以便它不会添加到内存占用)。在这种情况下,你可以做的事情不多。

此外,由于穆罕默德建议,你可以阅读this

1

记住几件事情:

  • 你的应用程序有一个内存限制(这取决于Android版)。你没有得到所有的设备内存。我认为第一个android版本的内存限制为16mb。
  • 文件的大小并不代表内存中位图的大小。例如,一个32位ARGB位图将采取32*width*height
  • 如果您正在处理大图像,则先对其进行缩放。计算你需要的尺寸(这可能是你的尺寸ImageView)并加载一个调整大小的位图副本。如果您计划支持的所有设备,把所有的资源到xhdpi文件夹,你可以做到这一点使用BitmapFactory.Options
2

我给你我如何管理,以减轻这一问题

  • 一些提示。 !尤其是背景
  • 文件大小=内存大小