几天前,我们在Play商店发布了一款应用程序,它处理高质量的位图,并且都在编辑它们。
当我们意识到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发布于 2015-09-03 12:38:52
你真的确定是因为某种原因
Bitmap.copy(.)
不是叫了两次吗?
即:
//first call Bitmap anotherBitmap = bitmap.copy( bitmap.getConfig(),true );bitmap.recycle() ..。 //第二次调用Bitmap anotherBitmap = bitmap.copy( bitmap.getConfig(),true );bitmap.recycle();
https://stackoverflow.com/questions/32126497
复制相似问题