我很好奇下面的代码会不会泄露...
data = getBitmapdataFromCameraCallback();//this is immutable, so...
//make a mutable copy...
originalUserPhoto = BitmapFactory.decodeByteArray(data, 0, data.length).copy(Config.ARGB_8888, true);
Matrix matrix = new Matrix();
// -1 doesn't reverse it for some oddball reason, so, we get REALLY close to -1
matrix.preScale(-0.999f, 1.0f);//don't ask don't tell
originalUserPhoto = Bitmap.createBitmap(originalUserPhoto, 0, 0,
originalUserPhoto.getWidth(), originalUserPhoto.getHeight(),
matrix, true);
如果我在原地修改 originalUserPhoto(注意我将它作为 createBitmap 的源传递),是否会泄露原始数据?或者 JVM 是否足够智能以释放那里的数据?
最佳答案
是也不是。您有两个 Bitmap 对象(第一个由 decodeByteArray 创建,第二个由 createBitmap 创建),而第一个没有引用它,因此在未来的垃圾收集周期中,它可能会被删除。
虽然位图的 native 后备存储也会在回收位图时被删除,但我建议您在使用完第一个位图后手动删除它 - 将其保存在单独的引用中并调用 recycle()
就可以了。位图可能非常昂贵。
顺便说一句,如果您的 createBitmap 只是为了缩放,我会考虑在您通过传入选项对其进行解码时缩小原始位图。您将无法精确地缩放到您想要的大小,但至少您最终不会得到一个您将缩小到其大小的十分之一的笨重的巨大位图。这样会更快并且避免内存峰值。
关于java - 就地复制位图会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039798/