Android: ошибка «пытается использовать переработанное растровое изображение» с временными растровыми изображениями - PullRequest
20 голосов
/ 02 ноября 2011

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

.....
finalBitmap.recycle();
finalBitmap = null;
Bitmap tempBitmap  = BitmapFactory.decodeStream(fin, ...);
finalBitmap = Bitmap.createBitmap(tempBitmap, ....);
imgview.setImageBitmap(finalBitmap);
.....

Теперь, на этом мы закончили с tempBitmap,который был необходим только для переноса декодированного растрового изображения на шаг преобразования в createBitmap.Итак:

.....
tempBitmap.recycle();
tempBitmap = null;
.....

И ... происходит сбой с ошибкой «попытка использовать переработанное растровое изображение», в частности из-за перезапуска tempBitmap.tempBitmap не отображался и используется только прямо .

Что здесь не так? Должен ли я просто использовать finalBitmap и полагаться на createBitmap для управления им?( finalBitmap = Bitmap.createBitmap ( finalBitmap , ....) )?Я не вижу, какая будет существующая зависимость от tempBitmap, которая вызовет такой сбой.

Редактировать: Да, нулевое назначение, кажется, приводит к соответствующему, возможному сборка мусора, но я озадачен, почему recycle () для временного Bitmap так проблематичен в этом случае.У меня создается впечатление, что createBitmap () содержит ссылку на него, но почему и как долго?

1 Ответ

25 голосов
/ 02 ноября 2011

Прямо из Android документация :

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

Похоже, что функции createBitmap могут повторно использовать предоставленное вами растровое изображение.Если это так, то вам не следует перерабатывать временное растровое изображение, поскольку оно используется вашим окончательным растровым изображением.Одна вещь, которую вы можете сделать, это

if(tempBitmap != finalBitmap) {
   tempBitmap.recycle();
}

. Она должна перерабатывать tempBitmap только тогда, когда она не совпадает с finalBitmap.По крайней мере, кажется, что это подразумевает документация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...