安卓 - 堆增长 (碎片化) - 字节分配.. 未加载任何位图

10

这种情况发生在应用从闪屏界面加载到主页面时。只在设备上出现,而不在模拟器上出现:

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 预加载的图片...

我使用的设备是 Google Nexus Prime,Android 4.0

有人遇到过同样的问题吗?可以有人提供一些专业建议吗?


你正在加载的位图大小是多少? - Amokrane Chentir
2个回答

14

我曾经遇到过同样的问题,并找到了解决方案。

你是从资源文件中加载位图吗?如果是这样,请尝试将它们放入相应的drawable文件夹中,而不是保留在“drawable”或“drawable-mdpi”中。

当您的图像资源位于普通的drawable文件夹中时,对于系统来说,它意味着drawable-mdpi。因此,具有高dpi或特别高dpi(我相信Galaxy Nexus是特别高)的设备将扩展该资源以匹配设备的dpi。

如果您只对资源有1个大小,请将它们放在drawable-nodpi中,它将如实使用。但是,某些布局可能会受到影响,因此我将某些图像保留在drawable文件夹中(例如按钮图像等),并将背景和其他较大的资源移动到drawable-nodpi中。

希望这可以帮助您 ;)


我将所有的图片放在drawable-hdpi文件夹中。但是我在drawable文件夹中有另外一些用于按钮状态改变样式的xml文件。这些xml文件包含了图片... 这会引起问题吗? - Ashwin
我将图片更改为建议的文件夹,但没有效果。而且我所有的图片都是PNG格式的,整个应用程序中最大的图片只有77kb。这不合理,因为在初始启动时它分配了24 MB。 - Ashwin
3
@Ashwin 嗯,我想问题在其他地方。 顺便说一下,PNG只是一种压缩图像以便于传输的方式。当需要在屏幕上显示时,它需要被解压缩。因此,重要的不是文件大小,而是图像的尺寸。 每个像素占用一定的内存,具体取决于位图设置,但是如果使用ARGB_8888,每个像素将占用32位。使用PNG只会帮助你的apk文件更小。 确保你的图像不要太大。 - hjm
@Ashwin 试着查看这个答案。https://dev59.com/omw05IYBdhLWcg3wcRQj - hjm
我验证了这些图片,它们的尺寸为960 X 640像素。您能否建议最佳方法...我将其用作相对布局的背景,该布局是根节点。 - Ashwin
显示剩余5条评论

10

你可能正在尝试解码一个非常大的 Bitmap,导致出现了 OutOfMemory 异常。这意味着你尝试执行的操作超出了设备上每个应用程序允许的 VM 预算,以堆内存消耗为例(在你的设备上似乎为 24 MB,在模拟器上可能更多,这就是为什么它不会在那里发生异常的原因!)。

尝试将你的 Bitmap 缩小一半进行采样:

BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Bitmap b = BitmapFactory.decodeFile(pathToBitmap, o);

1
@AmitJayaswal 感谢您指出这一点,我已经进行了编辑。它是一个字符串,表示要解码的文件路径。 - Amokrane Chentir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接