我很好奇以下代码是否会泄漏...
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是否足够智能以释放那里的数据?
答案 0 :(得分:3)
是和否。你有两个Bitmap对象(第一个由decodeByteArray创建,第二个由createBitmap创建),第一个没有引用它,因此在未来的垃圾收集周期中,它可能会被删除。
那就是说,当Bitmap被回收时,位图的原生后备存储也会被删除,我建议你在完成后使用它来手动删除第一个位图 - 将它保存在一个单独的引用中并调用{{ 1}}就可以了。位图可能非常昂贵。
顺便说一句,如果你的createBitmap的点只是为了缩放,我会考虑通过传入选项来解码原始位图。你将无法缩放到你想要的那个大小,但至少你不会得到一个笨拙的巨大位图,你可以缩小到它的大小的十分之一。这将更快,并避免内存峰值。