2015-08-20 16 views
9

几天前,我们在Play商店中发布了一个应用程序,该应用程序处理高质量的位图,并且都是关于编辑它们。对于bitmap.recycle()或不是bitmap.recycle()

当我们意识到20%的设备发生内存不足错误时,一切进展顺利。所以我们检查了我们的代码,发现Android并没有发布用于在某些设备上存储位图数据的本地内存。在这种情况下,我们欢迎回收命令。

内存错误消失(至少在高清设备中)。无论如何,我们很高兴。但是,今天我们开始看到50%的设备开始出现另一个错误:“无法复制回收的位图”

我们感到很沮丧。在两个bitmap.copy()在我们的代码行,该器件的一半不能同步做两行:

Bitmap anotherBitmap = bitmap.copy(bitmap.getConfig(), true); 
bitmap.recycle(); 

所以我们去掉了回收和释放另一个更新,决定限制设备的屏幕尺寸,因此小的不给我们一个坏评级。

这是我的问题。为什么有些设备可以在回收之前进行复制,而一半则不能?

我读了Google的位图相关文档,已经知道位图是如何存储在vm堆和本机堆上的,垃圾收集如何处理内存不足错误等.Google提供的用于加载和编辑大型位图的示例代码差不多和我们一样。

阅读了很多博客,谷歌群组线程,github代码示例...我想我仍然需要一个关于Android位图的很好的文档/书籍。

PS:我们已经在使用inSampleSize在解码位图时缩放位图。

编辑 - 下面是从崩溃报告的一些数据:

所有设备都是无根。在大多数情况下,使用的内存在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 
+0

至于我还记得,如果一个位图放在本机内存与你正在运行的Android版本做的,后来的Android版本不把它们存储在本地RAM和那些你不需要打电话回收的人。当谈到实际发生的事情时,你打电话复制和回收它取决于oem制造商和android版本,你能提供更多关于设备和平台的信息吗? – JohanShogun

+0

一种可能的行动方式可能是仅在运行姜胡子或更早的手机上呼叫回收(如果您的数据与哪些手机出现问题支持内存不足问题的手机都在运行姜面包或更早版本的想法)。 – JohanShogun

+0

关于位图的文档,最快和最简单的事情是检查aosp如何处理事情,一些制造商确实改变了事情(三星是最大的罪魁祸首),但它应该给你足够的信息,告诉你如何在大多数设备上完成事情,轻松搜索aosp:http:// androidxref。com – JohanShogun

回答

0

你真的确定,由于某种原因

bitmap.copy(..)

不叫两次吗?

即:

//first call Bitmap anotherBitmap = bitmap.copy(bitmap.getConfig(), true); bitmap.recycle();

[...]

// second call Bitmap anotherBitmap = bitmap.copy(bitmap.getConfig(), true); bitmap.recycle();

+1

是的。回收仅使用一次。我们使用这个第一副本的效果。创建第二个副本用于重置从第一个副本创建的编辑图像,而不是原始副本。具有空指针异常的设备正在告诉同一类的同一行有问题。只有约50%的设备出现故障。剩余的没有回收问题。目前我们改变了我们的编辑工作流程,并一起去除了回收。很可能我们会将图像读取移动到ndk以获得更好的内存管理,因为android的gb在位图方面是一团糟。 – emrahgunduz

相关问题