android内存不足以包含一些图像按钮

时间:2013-10-21 16:24:26

标签: android image button out-of-memory

实际上,我很长时间都希望知道如何以适当的方式呈现图形。

在一项活动中,我有以下内容:

  • 背景(png,全屏,768 * 1280,1.36MB)
  • 3个图标(每个图标已按下而未按下:2个状态,使用1个png 400 * 400,每个300KB),即3个图标* 2 pic * 300KB = 1.8MB
  • 更多文字视图

当应用程序启动并直接进入此活动时,一切正常,活动可以正常显示。

然而,不知何故,当应用程序运行其他一些活动,然后通过对话框进入此活动时,大多数时间会发生错误,如下所示:

Out of memory on a 15728656-byte allocation.

问题:

我已经研究了一段时间,有些人对bitmap.recycle()说,但是如何实现?通过onCreate?或者实际上400 * 400太大了?

如果我想根据用户的选择更改活动的背景,即当他按下按钮A时,背景变为bgdA,按下按钮B会将背景改变为bgdB ......这样可以实现如何实现?

非常感谢!

3 个答案:

答案 0 :(得分:2)

根据资产的存储位置是可能需要的内存量,因为缩放因子是在密度差之间计算的,这是一个小灰色区域,因为我还没有找到支持此信息的任何官方android文档但是,我已经多次看到这个错误了,这就是我处理它的方式。

1.-如果您没有适当的drawable-(密度)资产,这将导致问题,因为根据您实际支持的设备,您应该将资产放入drawable-xxhdpi或drawable-xhdpi ,你会注意到内存将如何大幅减少

2.-如果你不想搞乱密度,因为它是一个没有太多细节的通用图像(如简单的背景),那么在drawable-nodpi文件夹中添加资产,它会阻止android从试图扩大自己的资产..

3.-作为良好的做法,尝试创建适当大小的资产以获得适当的密度,400 x 400对于图标来说似乎太多了,这也会阻止您进入OOM,不仅仅是在此活动中,而且对于可能还需要加载大量资产的其他活动,为您的应用提供可扩展性..

总是认为将一个Image的“调整大小”留给操作系统可能会导致分配大量内存,因为操作系统会尝试根据公式宽度*高度* 4字节调整大小,4个字节用于ARGB每个像素,每个颜色1个字节或alpha,所以如果您的图像是例如1090 * 1920,即使实际图像大小只有几KB,它也很容易变成内部8.3MB,如果它试图缩放它,它可能会加倍它的大小。

希望这有助于

问候!

答案 1 :(得分:1)

确保您拥有该图像中每个可绘制文件夹的图像副本,例如,如果您在S4手机上运行您的应用程序并且您没有drawable-xxhdpi文件夹中的所有图像,那么您将耗尽即使是相当小的图像也能记忆。

此外,如果您需要在运行时更改背景,请使用setBackgroundResource。

希望有所帮助

答案 2 :(得分:0)

这是android中的常见问题,这是正确的解决方案 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html  简单来说,你必须根据你的要求缩小图像