我将一个应用程序(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很奇怪..答案 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
}