Android и утилизация изображений
Как именно работает утилизация изображений в Android?
Позвольте мне уточнить:
Если у меня есть следующее:
myBitmap = BitmapFactory.decodeResource(curView.getResources(), R.drawable.mypic);
И войти следующее
Log.v("ImageStuff","Image is: "+myBitmap);
Я получаю следующий результат:
Image is: android.graphics.Bitmap@(ResourceID here)
Что здорово, однако, если я делаю то же самое, но называю рециркуляцию вот так
myBitmap = BitmapFactory.decodeResource(curView.getResources(), R.drawable.mypic);
myBitmap.recycle()
Я получаю те же результаты, что и выше. Я думал, что вызов recycle очистит растровое изображение, так что он будет записан как ноль?
Также, если у меня есть метод, который принимает растровое изображение, например, так:
public void doStuff(Bitmap pic){
//Code here
}
Создайте мое растровое изображение, как указано выше, и отправьте его в doStuff:
myBitmap = BitmapFactory.decodeResource(curView.getResources(), R.drawable.mypic);
doStuff(myBitmap);
Если я хочу переработать изображение, мне нужно вызвать myBitmap.recycle(); а также pic.recycle (в моем методе doStuff после того, как я покончу с ним).
2 ответа
Bitmap
Объект содержит данные изображения (значения пикселей, размещенные под колпаком), это не сами данные изображения. Так, Bitmap
объект может торчать после recycle()
, но выдаст ошибку при попытке работы с данными.
Ты звонишь recycle()
когда вы или любой другой объект больше не собираетесь использовать Bitmap каким-либо образом. Вы также можете установить myBitmap = null
чтобы сам объект собирал мусор.
Чтобы расширить комментарии User117:
1) Растровое изображение - это просто контейнер для данных изображения. Когда вы вызываете recycle, он удаляет все данные изображения, но все равно сохраняет контейнер.
2) Если вы передаете Bitmap в ваш метод doStuff, который просто передает ссылку на растровое изображение, нет необходимости дважды вызывать recycle, поскольку объекты совпадают. Просто вызовите recycle на myBitmap после вызова doStuff, если он вам больше не нужен.