android - 到 bitmap.recycle(),或不到 bitmap.recycle()

标签 android bitmap recycle

几天前,我们在 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/

相关文章:

c - 双线性插值图像调整大小标记 & 'splotches'

android - 查看页面 : lose the state of toggle button when swiping

R,将数字输入转换为受上限限制的循环数字输出的函数

android - 签名 APK 中的空响应 - 调试 APK 中的正确响应

android - 如何在 map 上显示所有位置

java - Android - 带有 OPENGL + 纹理的 3D 立方体

c# - 将 BitmapImage 存储在文本文件中(然后再返回)

d3.js - 当我将它们传递到另一个函数时,为什么选择更新不起作用?

android - 引用属性枚举值

javascript - Web View 中的 Android Javascript 接口(interface)空对象