我需要加载20多个图像,以形成一个交互式地图,每个图层都可以打开和关闭。
我决定使用LayerDrawable
,但我一直收到OutOfMemoryError。即使在我将Large Heap设置为true之后,它也可以加载大约8个图像,但如果超过这个值,它仍然会抛出错误。
有没有一种方法可以在不出现错误的情况下将大量图像加载到LayerDrawable
中,或者有更好的方法可以做到这一点?
多亏了Luksprog的链接,我才解决了这个问题。
在将图像添加到Drawable[]
之前,我使用inSampleSize
加载了每个图像的较小版本。这减少了很多人使用的内存量。
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);
使用大堆标志仅适用于蜂窝及以上版本,并且它不会向您承诺将获得多少内存。你可以得到和以前一样的金额。
如果你想加载很多高质量的图像,你可以将它们缩小到屏幕的最大值,或者使用非java解决方案(例如openGL/andengine/lbgdx来显示内容)。
如果您选择java解决方案,您应该知道应用程序的设备堆的最低容量是16MB。我希望从某种android API开始它会更大,但这不是你可以假设的(尽管我还从未见过有这样限制的新设备)。
通常,你可以假设你的应用程序总是有足够的内存来保存一个包含整个屏幕的位图。你甚至可以假设它总是比这个多一倍,但就是这样。
如果您选择本机其他解决方案,则仅限于设备RAM内存,但您可以自行释放内存。
请注意,无论您选择哪种解决方案,您仍然受到设备内存量的限制。