Android - битмап и управление памятью? - PullRequest
13 голосов
/ 25 января 2012

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

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

Ответы [ 4 ]

17 голосов
/ 25 января 2012

Вступай в клуб.Это вроде как, но не совсем.

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

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

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

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

1 голос
/ 25 января 2012

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


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


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

0 голосов
/ 23 мая 2013

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

...