我收到大图片(png,> 30Mb)并为其创建位图。并获取java.lang.OutOfMemoryError。我试图抓住这样的例外:
try {
Bitmap bmp = BitmapFactory.decodeStream(someStream);
} catch (OutOfMemoryError e) {
;
}
使用2.2 SDK,效果很好。但2.3应用程序失败,未捕获异常。我不明白,为什么?
谢谢!
答案 0 :(得分:6)
你真的不想捕捉错误:
来自Javadoc:
错误是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。大多数此类错误都是异常情况。 ThreadDeath错误虽然是“正常”条件,但也是Error的子类,因为大多数应用程序都不应该尝试捕获它。
如果你得到一个错误,尤其是OutOfMemoryError,那么基本上已经太晚了,无法对它做任何事情。
答案 1 :(得分:1)
您需要重新调整位图图像的大小,然后才能使用它们进行显示。 请查看有关how to re-size bitmaps.
的本教程修改强> 或者你可以尝试使用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);
答案 2 :(得分:0)
30 mb太大了。我很惊讶您能够在Android 2.2手机中创建一个位图。我的建议是使用更小的图像文件。在许多手机中,24-30mb是整个应用程序的内存。
在您的情况下,您必须得到一个错误,如StackOverFlowError。你无法发现错误,
答案 3 :(得分:0)
将图像解码为较低分辨率。在android上你只允许大约16mb。在最坏的情况下,您可以选择增加此设置。
此外,姜饼前GC与后姜饼不同。在它停止使用完全垃圾收集的世界GC之前,但在此之后,GC变为并发,允许部分收集。