我想加载大尺寸的图像,但我有问题。它崩溃,因为 OutOfMemoryError。这是我的数组:
Integer[] img = {
R.drawble.pic1, R.drawble.pic2, R.drawble.pic3, R.drawble.pic4
};
如何将 img[0]、img[1]、img[2] 和 img[3] 转换为位图?请帮忙..对不起我的英语不好。
试试这段代码,你会将一个 id 数组转换成一个数组Bitmap
:
Integer[] img = { R.drawble.pic1, R.drawble.pic2, R.drawble.pic3,
R.drawble.pic4 };
Bitmap[] bitmap = new Bitmap[img.length];
for (int i = 0; i < img.length; i++)
bitmap[i] = BitmapFactory.decodeResource(getResources(), img[i]);
如果您在转换大尺寸图像时遇到问题,请查看高效显示位图。
在这里检查:http: //developer.android.com/training/building-graphics.html
和 BitmapFactory 类:http: //developer.android.com/reference/android/graphics/BitmapFactory.html
Android 应用程序的堆大小有限(旧设备上的最小堆大小为 16MB)。这因设备而异,因此在 QA 期间要小心。由于位图每个像素可以占用多达 4 个字节,因此大位图可以轻松填满您的堆(1000 x 1000 像素 = 3.8MB)
这意味着您必须非常小心并使用几种策略来避免浪费内存:
不要同时将所有位图加载到内存中。例如,如果您在 a 中显示它们,则一次ViewPager
只能加载 1-2 页。当页面被隐藏时,销毁其位图并调用bitmap.recycle()
以确保立即释放内存。
如果位图大于您的屏幕尺寸,您可以将其缩小以节省内存。这里的技术可以让你加载它最初减少 2/3/4。如果你需要更多的微调,你可以加载它的全尺寸,然后使用Bitmap.createScaledBitmap
. 只是不要recycle()
立即忘记原始的大位图。
确保使用内存检查工具(例如DDMS或Eclipse MAT
. 我建议在 Android 4+ 上进行大多数探索,因为 2.x 将位图保存在无法轻松探索的本机堆中。如果您可以将您的应用程序保持在 16MB 的峰值内存消耗以下,那么您将永远不会再次遇到 OutOfMemoryError。