我需要加载 20 多个图像,以形成一个交互式地图,其中每个图层都可以打开和关闭。
我决定为此使用 a LayerDrawable
,但我不断收到 OutOfMemoryError。即使我将 Large Heap 设置为 true,它也可以加载大约 8 张图像,但除此之外它仍然会抛出错误。
有没有办法将大量图像加载到 aLayerDrawable
而不会出现该错误,或者有更好的方法来做到这一点?
我需要加载 20 多个图像,以形成一个交互式地图,其中每个图层都可以打开和关闭。
我决定为此使用 a LayerDrawable
,但我不断收到 OutOfMemoryError。即使我将 Large Heap 设置为 true,它也可以加载大约 8 张图像,但除此之外它仍然会抛出错误。
有没有办法将大量图像加载到 aLayerDrawable
而不会出现该错误,或者有更好的方法来做到这一点?
感谢 Luksprog 的链接,我能够解决这个问题。
在inSampleSize
将它们添加到Drawable[]
. 这减少了很多使用的内存量。
使用大堆标志仅适用于蜂窝及更高版本,它不会向您保证您将获得多少内存。您可以获得与以前相同的金额。
如果您希望加载大量高质量图像,可以将它们缩小到屏幕的最大值,或者使用非 Java 解决方案(例如 openGL/andengine/lbgdx 来显示内容)。
如果您选择 java 解决方案,您应该知道设备的应用程序堆的最低限度是 16MB 。我希望从某种 android API 开始它会更大,但这不是你可以假设的(尽管我从未见过有这种限制的新设备)。
一般来说,您可以假设您的应用程序始终有足够的内存来保存具有整个屏幕的位图。你甚至可能认为它总是比这多一倍,但就是这样。
如果选择原生的其他解决方案,则仅限于设备RAM内存,但释放内存需要你自己。
请注意,无论您选择哪种解决方案,您仍然受限于设备的内存量。
类似的东西?
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);