OutOfMemoryException:位图超出VM预算

时间:2011-07-20 07:31:58

标签: android memory bitmap

我将一个应用程序(Hungry Birds)上传到了市场,一位朋友为他的Xperia x10下载了它。他将Bitmap从默认的非动画版本更改为动画版本,这就是游戏崩溃的时候。我在Nexus 1,HTC Magic,HTC Desire和模拟器上进行了大量测试,它们在其他任何地方都可以正常工作。为什么Xperia会这样做?有没有办法在代码中增加特定设备上的VM预算?

编辑: 当创建一个200kb大的资源(png)时会抛出异常,尽管我大多只使用它的较小的部分(这对于平板电脑支持来说很重要)。

EDIT2: 奇怪的是,当我将堆大小降低到12mb时,代码在我的开发电话(HTC Magic with 2.2 CyanogenMod)上工作。据我所知,最低为16mb。任何想法为何起作用?

BTW:在我实施了解决方法后,它突然开始在X10上工作,不知道为什么。 Android很奇怪..

2 个答案:

答案 0 :(得分:0)

is there a way to increase the VM budget on specific devices in the code?

- 这是不可能的。

只有解决方案才能处理代码中的 outOfMemoryException

要避免这种 outOfMemoryException ,您可以遵循这两个简单的事情。 使每个周期的位图为空。完成位图使用后,您可以像这样回收您的位图bitmap.recycle();。这将删除位图消耗的内存。

答案 1 :(得分:0)

我有好几次这个问题。我发现解决这个问题的唯一方法是测量设备上剩余的内存量,以便缩小(不总是可能)或使用其他类型的降级模式。

我首先获得可用内存量:

final Runtime rt = Runtime.getRuntime();
final long freeMem = rt.freeMemory() + (rt.maxMemory() - rt.totalMemory());

然后我将它与我的资源大小进行比较(可以是图像,声音,其他任何东西......)。我通常应用比率(从0.50到0.80,但这是策略问题)以避免消耗所有可用内存。

if (myResourceSize < (freeMem * ratio)) { 
    // use it as it is
}
else {
    // use (or create if possible) something smaller
}