创建位图的java.lang.outofmemoryerror

时间:2012-05-31 10:10:11

标签: java android

我收到大图片(png,> 30Mb)并为其创建位图。并获取java.lang.OutOfMemoryError。我试图抓住这样的例外:

try {
    Bitmap bmp = BitmapFactory.decodeStream(someStream);
} catch (OutOfMemoryError e) {
    ;
}

使用2.2 SDK,效果很好。但2.3应用程序失败,未捕获异常。我不明白,为什么?

谢谢!

4 个答案:

答案 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变为并发,允许部分收集。