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

Android - битмап и управление памятью?

Я видел во многих образцах, что разработчики называют recycle() в растровом изображении, а затем устанавливают его на null. Почему это необходимо, разве сборщик мусора не заботится о выпуске растрового изображения?

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
bitmap.recycle();
bitmap = null;
4b9b3361

Ответ 1

Присоединяйтесь к клубу. Это не совсем так.

Дело в том, что в версиях Android до сотовой памяти память для растровых изображений была выделена из неуправляемой памяти, что создает всевозможные проблемы. Он все еще выпущен, но из финализатора реализации объекта bitmap. Это означает, что для его сбора потребуется не менее 2 проходов GC. Также, если по какой-либо причине финализатор не выполнит - вы получили снимок. Другое дело - это очень сложно отследить - DDMS не видит его, и MAT

Для Android 3.0 это было изменено, а растровые изображения реализованы по управляемым массивам байтов, но для старых телефонов...

Ответ 2

bitmap.recycle(); освободить кучу родной, которая используется в битмапах. И установка его в null - это помочь GC быстро собрать вашу ссылку.

Ответ 3

Из документов в http://developer.android.com/reference/android/graphics/Bitmap.html#recycle%28%29.


Освободите собственный объект, связанный с этим растровым изображением, и очистите ссылку на данные пикселя. Это не освобождает данные пикселя синхронно; он просто позволяет собирать мусор, если нет других ссылок. Растровое изображение отмечено как "мертвое", что означает, что оно выдает исключение, если вызывается getPixels() или setPixels(), и ничего не рисует. Эта операция не может быть отменена, поэтому ее следует вызывать, только если вы уверены, что для растрового изображения больше не используются. Это расширенный вызов и, как правило, не нужно вызывать, так как обычный процесс GC освободит эту память, если больше нет ссылок на это растровое изображение.


Так что, похоже, не нужно звонить. Единственный раз, когда я когда-либо слышал о необходимости вручную установить объект в null, является его статическая переменная (или какая-то переменная, которая не выйдет за пределы области легко), и вы хотите вывести ее из памяти. Возможно, если вы постоянно выделяете растровые изображения быстро, может возникнуть необходимость попытаться принудительно собрать мусор, но в большинстве случаев это, вероятно, не нужно.