Не копирует ли растровое изображение память? - PullRequest
3 голосов
/ 28 января 2012

Мне любопытно, если следующий код будет течь ...

    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 Ответ

3 голосов
/ 28 января 2012

Да и нет. У вас есть два объекта Bitmap (первый создан с помощью decodeByteArray, второй - с помощью createBitmap), а первый ничего не имеет к нему, поэтому в будущем цикле сбора мусора он может быть удален.

Тем не менее, хотя собственное резервное хранилище для растрового изображения будет также удалено при повторном использовании растрового изображения, я бы порекомендовал вручную удалить первое растровое изображение после того, как вы закончили его использовать - сохраните его в отдельной ссылке и вызовите recycle() в теме. Растровые изображения могут быть очень дорогими.

Между прочим, если точка вашего createBitmap просто масштабируется, я бы рассмотрел масштабирование исходного растрового изображения при его декодировании путем передачи параметров. Вы не сможете масштабировать до нужного вам размера, но, по крайней мере, у вас не будет громоздкого огромного растрового изображения, которое вы уменьшите до одной десятой от его размера. Это будет быстрее и позволит избежать скачка памяти.

...