几天前,我们在 Play 商店发布了一个应用程序,它处理高质量的位图并且完全是关于编辑它们。
当我们意识到 20% 的设备出现内存不足错误时,一切进展顺利。所以我们检查了我们的代码,发现 Android 没有释放用于在某些设备上存储位图数据的 native 内存。在这种情况下,我们欢迎回收命令。
内存错误消失了(至少在高清设备中)。不管怎样,我们很开心。但是今天我们开始看到 50% 的设备开始出现另一个错误:“无法复制回收的位图”
我们很沮丧。在我们代码中的两行 bitmap.copy() 中,一半的设备无法同步执行这两行:
Bitmap anotherBitmap = bitmap.copy( bitmap.getConfig(), true );
bitmap.recycle();
因此我们删除了回收并发布了另一个更新,决定限制设备屏幕尺寸,因此小屏幕不会给我们差评。
这是我的问题。为什么有些设备可以在回收前复制,而一半不能?
我阅读了 Google 的位图相关文档,并且已经知道位图如何存储在 vm 堆和 native 堆上,垃圾收集如何处理内存不足错误等。Google 提供的加载和编辑大型位图的示例代码几乎相同作为我们的。
阅读了很多博客、谷歌群组线程、github 代码示例...我认为我仍然需要一本关于 Android 位图的好文档/书籍。
PS:我们已经在解码位图时使用 inSampleSize 来缩放位图。
编辑——以下是崩溃报告中的一些数据:
所有设备都是非root的。在大多数情况下,使用的内存在 25% 到 35% 之间。
Manufacturers:
57% LG
31% Samsung
10% Casper Via V5 (Turkey based company, sells rebranded Chinese phones)
Devices:
81% LG D855 (G3)
18% LG D802TR (G2)
----
66% Samsung SM N910C (Galaxy Note 4)
20% Samsung SM A700F (Galaxy A7)
Operating Systems:
68% Android 5
31% Android 4
OS 5 Details
69% Android 5.0
30% Android 5.0.1
OS4 Details
66% Android 4.4.2
33% Android 4.4.4
最佳答案
你真的确定出于某种原因吗
位图.copy(..)
没有被调用两次?
即:
//first call Bitmap anotherBitmap = bitmap.copy( bitmap.getConfig(), true ); bitmap.recycle();
[...]
// second call Bitmap anotherBitmap = bitmap.copy( bitmap.getConfig(), true ); bitmap.recycle();
关于android - 到 bitmap.recycle(),或不到 bitmap.recycle(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32126497/