描述背景,因为我可能只是对问题采取了一种可怕的方法 - 自学。
我正在为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)。事实上,之前的应用程序曾经通过翻转它来制作每个图像的几个副本,但仍然没有耗尽空间。当前的应用程序在初始加载时失败 - 在很多事情发生之前。
有人能指出我可能出现的问题吗?我如何解决它,或者提一下我的方法是否错误(从示例中自我教导)
答案 0 :(得分:2)
我会给你一些关于我如何设法减轻这个问题的提示
答案 1 :(得分:1)
是的,这是一个非常常见的问题。所以在旧版本的Android OS中,位图被加载到本机内存而不是JVM中。垃圾收集过程确实有2个周期。一个用于清除JVM中的内存,另一个用于清除本机内存中的内存(用于位图)。如果您想使用较旧的设备,则需要通过回收位图Bitmap.recycle()
或致电System.gc()
您可能会遇到两个问题: 1.您还有其他未经回收的位图。 你真的因为单个图像太大而内存不足。 (确保其他图像已正确回收或gc&d;以便它不会增加内存占用量)。在这种情况下,你无能为力。
另外,正如mehmet建议的那样,你可以阅读this
答案 2 :(得分:1)
请记住以下几点:
32*width*height
位ImageView
的大小)并加载位图的调整大小的副本。您可以使用BitmapFactory.Options