复制位图是否会泄漏内存?

时间:2012-01-27 20:43:44

标签: java android memory-management bitmap

我很好奇以下代码是否会泄漏...

    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是否足够智能以释放那里的数据?

1 个答案:

答案 0 :(得分:3)

是和否。你有两个Bitmap对象(第一个由decodeByteArray创建,第二个由createBitmap创建),第一个没有引用它,因此在未来的垃圾收集周期中,它可能会被删除。

那就是说,当Bitmap被回收时,位图的原生后备存储也会被删除,我建议你在完成后使用它来手动删除第一个位图 - 将它保存在一个单独的引用中并调用{{ 1}}就可以了。位图可能非常昂贵。

顺便说一句,如果你的createBitmap的点只是为了缩放,我会考虑通过传入选项来解码原始位图。你将无法缩放到你想要的那个大小,但至少你不会得到一个笨拙的巨大位图,你可以缩小到它的大小的十分之一。这将更快,并避免内存峰值。