我收到大图像(png,>30Mb)并为其创建位图。并得到 java.lang.OutOfMemoryError。我试图捕捉这样的异常:
try {
Bitmap bmp = BitmapFactory.decodeStream(someStream);
} catch (OutOfMemoryError e) {
;
}
使用 2.2 SDK 它运行良好。但是使用 2.3 应用程序失败并出现未捕获的异常。我不明白,为什么?
谢谢!
你并不是真的要捕捉错误:
从Javadoc:
Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应该尝试捕获它。
如果你得到一个错误,尤其是一个 OutOfMemoryError,基本上已经太迟了,不能对此做任何事情。
您需要重新调整位图图像的大小,然后才能使用它们来显示。看看这个关于如何调整位图大小的教程。
编辑 或者您可以尝试使用 FileOutputStream 将位图作为文件保存到文件系统。像这样的东西。
byte[] imageData;
FileOutputStream out = new FileOutputStream(file);
out.write(imageData, 0, imageData.length);
out.flush();
out.close();
像这样解码位图,并按照上面链接中的指定缩放/调整它的大小。
FileInputStream inputStream = new FileInputStream(file);
BitmapFactory.decodeStream(inputStream, null, options);
30 mb 太大了。我很惊讶您能够在 android 2.2 手机中创建位图。我的建议是使用小得多的图像文件。在许多手机中,24-30mb 是分配给整个应用程序的内存。
在您的情况下,您必须收到诸如 StackOverFlowError 之类的错误。你无法捕捉错误,
将图像解码为较低的分辨率。你在android上只允许大约16mb。在最坏的情况下,您可以选择增加此设置。
此外,pre-gingerbread GC 与 post-gingerbread 不同。在它停止之前,世界 GC 使用完全垃圾收集,但在那之后,GC 变为并发,允许部分收集。