Android 为什么ASUS Transformer Prime是唯一存在OutOfMemory异常的设备

Android 为什么ASUS Transformer Prime是唯一存在OutOfMemory异常的设备,android,out-of-memory,tablet,android-4.0-ice-cream-sandwich,Android,Out Of Memory,Tablet,Android 4.0 Ice Cream Sandwich,我正在开发一个Android应用程序,它需要显示4个大位图(6倍屏幕大小)。一开始,我有这个问题,但是内存管理的代码优化可以在整个设备上运行。但在4.0.3 android版本的华硕Transformer Prime上,我有一个OutOfMemory错误。这很奇怪,因为堆的大小似乎是256Mb。与其他能够正常运行的设备相比,这有很多好处 我们已经激活了大型堆并停用了硬件加速 您知道我们的问题吗?您的屏幕是1280x800,因此屏幕大小为32bpp的位图需要略低于4MB,而6倍屏幕大小的位图需要2

我正在开发一个Android应用程序,它需要显示4个大位图(6倍屏幕大小)。一开始,我有这个问题,但是内存管理的代码优化可以在整个设备上运行。但在4.0.3 android版本的华硕Transformer Prime上,我有一个OutOfMemory错误。这很奇怪,因为堆的大小似乎是256Mb。与其他能够正常运行的设备相比,这有很多好处

我们已经激活了大型堆并停用了硬件加速


您知道我们的问题吗?

您的屏幕是1280x800,因此屏幕大小为32bpp的位图需要略低于4MB,而6倍屏幕大小的位图需要23.5MB。你想要四个。。。那是93.75MB

进程堆限制从设备到设备不同,但我认为64 MB是很多的(也许我落后于时代)。256MB是巨大的

我想你根本不应该在内存中保存这么大的位图。你最好把它们分解成不比屏幕大的瓷砖,然后根据需要加载瓷砖


或者,尝试使用16bpp图像或在JNI(即C)中为大量位图分配空间,完全绕过Java堆管理。

我们不需要4个6倍屏幕高度的位图,只需要一个。其他的更小。这4个位图必须同时加载,因为它们在它们之间显示并设置动画。非常奇怪的是,dosen没有在一个设备上生成一个异常(résolution,size),这个设备的初始值与堆大小的内存相似,但是堆大小的内存较少。可能你应该在打开位图时强制16bpp。