Подтвердить что ты не робот

Android: "попытка использования переработанного растрового изображения" с временными растровыми изображениями

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

.....
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). strong > ,....))? Я не вижу, что будет продолжаться зависимость от tempBitmap, которая может вызвать такой отказ.

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

4b9b3361

Ответ 1

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

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

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

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

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