Android 位图处理 - 没有泄漏但仍然 OOM?

标签 android memory-leaks bitmap

我正在编写一个相机应用程序,当我拍照时,我收到一个字节 [],将其解码为位图并在将其保存为 JPEG 之前对其进行旋转。我正在使用 native 库旋转照片,但是位图仍然从 byte[] 解码到内存中(仍然允许我保留 1 个位图而不是 2 个)。所以基本上在我的代码中有 1 个地方我需要大量内存和 OOM 在一些堆低且相机是愚蠢的百万像素的设备上。关于如何在不降低图像质量的情况下解决这个问题有什么建议吗?

我不认为我想使用largeHeap="true" 我应该忘记旋转而只设置 EXIF 吗?

此外,我不太热衷于尝试“预测”我是否会 OOM,因为数学没有加起来:Android OutOfMemory when GC reports free memory?

最佳答案

Any suggestions how to fix this without on loosing image quality?

使用 android:largeHeap="true"

或者,使用其他一些允许您交出 byte[] 并为您旋转并保存到磁盘的 native 库,以避免 Bitmap 和对大型事物的任何 Java 级处理。

或者,如果您的 minSdkVersion 是 19,并且您的其余逻辑支持它,请在 BitmapFactory.Options 上使用 inBitmap 来尝试重用一个已经分配的 Bitmap 对象而不是分配一个新的对象。此选项在早期版本的 Android 上可用,但对于那些它必须在分辨率方面完全匹配;对于 19 岁以上的用户,要重用的 Bitmap 必须足够大以处理您要加载到其中的内容。

I don't think I want to use largeHeap="true"

这可能无济于事(并非所有设备都会为您提供更大的堆),并且用户需要为更大的堆限制付出代价。话虽如此,如果没有更多内存,无论是在 Java 堆中还是代表操作系统从 native 代码分配的内存,都很难操纵大型相机图像。

Should I forget about rotation and just set EXIF?

这当然是另一种可能性,虽然各种东西,比如 ImageView,似乎忽略了 EXIF header 。

I'm not so keen on trying to 'predict' if I will OOM as the math's not adding up

部分原因是 Dalvik 没有压缩/移动 GC,而 ART 只有一个,而您的应用程序不在前台。 OutOfMemoryError 表示您尝试分配的内容没有单个连续的空闲内存块。

关于Android 位图处理 - 没有泄漏但仍然 OOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260420/

相关文章:

.net - WinDbg 没有告诉我字符串的根位置

android - android中如何初始化位图数组?

java - Android - 在现有 imageView 上绘制形状?

Java 内存泄漏 - 查找类 X 未被类 Y 引用的所有对象

iphone - 为对象分配内存时出现内存泄漏问题

android - 我的 Android XML 文件找不到 ActionBarSherlock 主题

android - 如何在android中动态添加具有多列的行?

Java 到 C# 的转换。如何在位图上绘制矩形?

android - "No implementation found for"使用 NativeActivity

android - 如何解决 IllegalStateException 和 ParserConfigurationException 以使用 apache OpenNLP 在 android studio 中查找位置