OutOfMemoryException
异常。scaledBitmap = Bitmap.createBitmap(8303, 5540, Bitmap.Config.ARGB_8888);
我该如何解决这个问题?
OutOfMemoryException
异常。scaledBitmap = Bitmap.createBitmap(8303, 5540, Bitmap.Config.ARGB_8888);
在AndroidManifest.xml
中设置android:largeHeap="true"
对我很有帮助。
创建这样大小的位图,您需要分配约183MB的内存。这对大多数手机来说都是个问题。您可以尝试在清单中设置android:largeHeap="true",但在大多数手机上,这仍然无法给您足够的内存。
如果您愿意接受图像的“子采样”版本,并且图像数据来自文件,则可以查看http://developer.android.com/training/displaying-bitmaps/load-bitmap.html以将大图像的子采样加载到内存中。基本上,您可以告诉BitmapFactory每X像素加载一次,从而避免了需要将所有183MB的图像数据放入内存的要求。
http://codingaffairs.blogspot.com/2016/07/processing-bitmap-and-memory-management.html
现在这里有一些提示,可以帮助您避免在Android应用程序中出现内存不足异常。
那么什么是inSampleSize? 通过inSampleSize,您实际上告诉解码器不要在内存中抓取每个像素,而是对图像进行子采样。 这将导致加载到内存中的像素数量比原始图像少。您可以告诉解码器从原始图像中抓取每4个像素或每2个像素。 如果inSampleSize为4,则解码器将返回一个大小为原始图像像素数的1/16的图像。
那么您节省了多少内存?自己算吧 :)
在将位图加载到内存之前读取位图尺寸。
在将位图尺寸读入内存之前如何帮助您避免内存不足错误?让我们学习一下
使用inJustBounds = true
这里有一种技术,可以在将图像加载到内存之前获取其尺寸。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
设备的屏幕大小和密度。
位图配置是图像的色彩空间/色深。Android中默认的位图配置为RGB_8888,即每个像素4字节。
如果您使用2字节每像素的RGB_565颜色通道,则相同分辨率的内存分配减半:)
使用inBitmap属性进行回收。
不要创建静态Drawable对象,因为它无法被垃圾回收。
在清单文件中请求大堆内存。
如果您正在进行大量图像处理(内存密集型任务),请使用多个进程或使用NDK(使用c、c++的本地开发)。