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