当应用从Splash屏幕加载到Main页面时会发生这种情况。它只发生在不在模拟器上的设备上:
05-17 08:10:16.627: I/dalvikvm-heap(14021): Grow heap (frag case) to 20.580MB for 2424256-byte allocation
05-17 08:10:16.666: D/dalvikvm(14021): GC_FOR_ALLOC freed 1K, 3% free 21000K/21511K, paused 21ms
05-17 08:10:16.697: D/dalvikvm(14021): GC_CONCURRENT freed 116K, 3% free 20885K/21511K, paused 2ms+2ms
05-17 08:10:16.720: D/dalvikvm(14021): GC_FOR_ALLOC freed 44K, 4% free 20841K/21511K, paused 10ms
05-17 08:10:16.728: I/dalvikvm-heap(14021): Grow heap (frag case) to 24.533MB for 4310896-byte allocation
我使用了Ecplise MAT - 解析了字节分配--Android.Graphics.Bitmap $ preloaded images ...
我使用的设备是Google Nexus Prime,Android 4.0
有没有遇到过同样的人?有人可以抛出一些专业知识......
答案 0 :(得分:14)
我遇到了同样的问题并找到了解决方案。
你是从资源加载你的位图吗?如果是这样,请尝试将它们放在相应的可绘制文件夹中,而不是将它们保存在“drawable”或“drawable-mdpi”中。
当您将图像资源放在普通的可绘制文件夹中时,对于系统来说,这意味着drawable-mdpi。因此,具有高或超高dpi的设备(我认为Galaxy Nexus为超高)将扩展该资源以匹配设备的dpi。
如果您的资源只有1个大小,请将它们放在drawable-nodpi中,它将按原样使用。但是你的一些布局可能会受到影响,因此我将某些图像保存在可绘制文件夹中(如按钮图像等),并将背景和其他更大的资源移动到drawable-nodpi中。
希望这会有所帮助;)
答案 1 :(得分:10)
您可能正在尝试解码一个非常大的Bitmap
,这会导致OutOfMemory
异常。这意味着您尝试实现的操作超出了设备上每个应用程序所允许的VM预算,就堆内存消耗而言(在您的设备上似乎是24 MB,在您的模拟器上可能更多,这就是为什么它没有不会发生在那里!)。
尝试以{2}为例将您的Bitmap
示例:
BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Bitmap b = BitmapFactory.decodeFile(pathToBitmap, o);