【发布时间】:2012-10-01 16:15:55
【问题描述】:
我的 Android 设备的位图工厂出现 OOM 错误。
Out of memory on a 12582928-byte allocation.
这对我来说很奇怪。它非常大。文件本身是平板电脑上的图像罐并下载。所以图像可能会在上限达到 1.2meg jpg 左右。
在它说错误之后,它会吐出 AndroidRuntime 错误日志以显示致命异常:
10-01 11:53:52.512: E/AndroidRuntime(31023): FATAL EXCEPTION: Thread-7893
10-01 11:53:52.512: E/AndroidRuntime(31023): java.lang.OutOfMemoryError
10-01 11:53:52.512: E/AndroidRuntime(31023): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-01 11:53:52.512: E/AndroidRuntime(31023): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:582)
10-01 11:53:52.512: E/AndroidRuntime(31023): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:380)
10-01 11:53:52.512: E/AndroidRuntime(31023): at com.bentley.cordova.plugins.ImageOps.createThumbnailForPath(ImageOps.java:43)
10-01 11:53:52.512: E/AndroidRuntime(31023): at com.bentley.cordova.plugins.ImageOps.execute(ImageOps.java:20)
10-01 11:53:52.512: E/AndroidRuntime(31023): at org.apache.cordova.api.PluginManager$1.run(PluginManager.java:192)
10-01 11:53:52.512: E/AndroidRuntime(31023): at java.lang.Thread.run(Thread.java:856)
我确实有很多同时使用此功能的图像处理。我认为 BitMapFactory 根本没有因为运行的不同线程而过度工作。
【问题讨论】:
-
请记住,完全展开的图像比文件中存储的形式占用更多的存储空间。
-
可能需要看一些代码,甚至不知道你在做什么。但是你检查过递归吗?完成后你会释放资源吗?
-
JPEG 是压缩的,位图不是。打开 alpha 通道后,每个像素需要 4 个字节来存储它。这转换为像素矩阵的 3145732 字节或大致为 1800x1800 像素;如果您尝试处理高清图像,这就是它失败的原因。你能看看你试图创建的维度吗?