LayerDrawable OutOfMemoryError

Posted

技术标签:

【中文标题】LayerDrawable OutOfMemoryError【英文标题】: 【发布时间】:2013-06-21 05:19:19 【问题描述】:

我需要加载 20 多张图像,以形成一个交互式地图,其中每个图层都可以打开和关闭。

我决定为此使用LayerDrawable,但我不断收到 OutOfMemoryError。即使在我将 Large Heap 设置为 true 之后,它也可以加载大约 8 张图像,但超过此值仍然会引发错误。

有没有办法将大量图像加载到LayerDrawable 而不会出现该错误,或​​者有更好的方法吗?

【问题讨论】:

这些图片有多大? @Luksprog 最小的是5.66kb,最大的是2.74mb 您无法将所有这些图像加载到内存中,因为它们没有内存。我会制作一个自定义视图,我会在其中按需加载图像(假设并非所有图像都以某种方式可见)。也看看developer.android.com/training/displaying-bitmaps/index.html @Luksprog 谢谢,那个链接很有帮助。我能够毫无问题地加载所有图像。 文件大小并不能说明它将占用多少内存。您应该提供有关图像分辨率和颜色深度的信息。 【参考方案1】:

感谢 Luksprog 的链接,我能够解决问题。

我使用inSampleSize 加载每个图像的较小版本,然后将它们添加到Drawable[]。这减少了很多人使用的内存量。

【讨论】:

【参考方案2】:

类似的东西?

Resources r = getResources();
Drawable[] layers = new Drawable[20];
layers[0] = r.getDrawable(R.drawable.01);
layers[1] = r.getDrawable(R.drawable.02);
etc[...]
LayerDrawable layerDrawable = new LayerDrawable(layers);
testimage.setImageDrawable(layerDrawable);

【讨论】:

我试过了,但是当它开始将图像添加到数组中时,它会抛出错误。 我不知道他的数组可能没有正确初始化,如果你有答案的话。【参考方案3】:

使用大堆标志仅适用于蜂窝及更高版本,它不会向您保证您将获得多少内存。您可以获得与以前相同的金额。

如果您希望加载大量高质量图像,请将它们缩小到屏幕的最大值,或者使用非 Java 解决方案(例如 openGL/andengine/lbgdx 来显示内容)。

如果您选择 java 解决方案,您应该知道设备的应用程序堆的最低限度是 16MB 。我希望从某种 android API 开始它会更大,但这不是你可以假设的(尽管我从未见过有这种限制的新设备)。

一般来说,您可以假设您的应用程序始终有足够的内存来保存具有整个屏幕的位图。你甚至可以假设它总是比这个值加倍,但就是这样。

如果您选择原生其他方案,则仅限于设备RAM内存,但您需要自行释放内存。

请注意,无论您选择哪种解决方案,您仍然受限于设备的内存量。

【讨论】:

以上是关于LayerDrawable OutOfMemoryError的主要内容,如果未能解决你的问题,请参考以下文章

自定义 LayerDrawable:onStateChange 从未调用

LayerDrawable OutOfMemoryError

将 ColorFilter 应用于 LayerDrawable 内的 Drawable

LayerDrawable:这可以更有效地完成吗?

用LayerDrawable实现两个图片的叠加效果

来自 LayerDrawable 的异常