0

我收到大图像(png,>30Mb)并为其创建位图。并得到 java.lang.OutOfMemoryError。我试图捕捉这样的异常:

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

使用 2.2 SDK 它运行良好。但是使用 2.3 应用程序失败并出现未捕获的异常。我不明白,为什么?

谢谢!

4

4 回答 4

6

你并不是真的要捕捉错误:

Javadoc

Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应该尝试捕获它。

如果你得到一个错误,尤其是一个 OutOfMemoryError,基本上已经太迟了,不能对此做任何事情。

于 2012-05-31T10:14:03.227 回答
1

您需要重新调整位图图像的大小,然后才能使用它们来显示。看看这个关于如何调整位图大小的教程。

编辑 或者您可以尝试使用 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);
于 2012-05-31T10:21:27.050 回答
0

30 mb 太大了。我很惊讶您能够在 android 2.2 手机中创建位图。我的建议是使用小得多的图像文件。在许多手机中,24-30mb 是分配给整个应用程序的内存。

在您的情况下,您必须收到诸如 StackOverFlowError 之类的错误。你无法捕捉错误,

于 2012-05-31T10:19:06.433 回答
0

将图像解码为较低的分辨率。你在android上只允许大约16mb。在最坏的情况下,您可以选择增加此设置。

此外,pre-gingerbread GC 与 post-gingerbread 不同。在它停止之前,世界 GC 使用完全垃圾收集,但在那之后,GC 变为并发,允许部分收集。

于 2012-05-31T10:20:18.000 回答