1

其实我很早就想知道如何以正确的方式呈现图形。

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

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

当app启动后直接进入这个activity,一切正常,activity可以正常呈现。

然而不知何故,当应用程序运行了一些其他活动,然后通过对话框进入该活动时,大部分时间都会出现错误,如下所示:

Out of memory on a 15728656-byte allocation.

问题:

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

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

非常感谢!

4

3 回答 3

2

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

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

2.- 如果你不想弄乱密度,因为它是一个没有太多细节的通用图像(比如简单的背景),然后将资源添加到 drawable-nodpi 文件夹中,它会阻止 android 尝试自行扩展资产..

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

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

希望这可以帮助

问候!

于 2013-10-21T16:45:37.793 回答
1

确保你的 res 中的每个 drawable 文件夹都有一个图像副本,例如,如果你在 S4 手机上运行你的应用程序并且你没有 drawable-xxhdpi 文件夹中的所有图像,你甚至会耗尽内存具有相当小的图像。

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

希望能帮助到你

于 2013-10-21T16:44:15.967 回答
0

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

于 2013-10-21T16:36:38.297 回答