Diff b / w bitmap.recycle () и bitmap = null - PullRequest
9 голосов
/ 07 июня 2011

Я нахожусь в ситуации, когда я использовал цикл for для загрузки набора изображений, и я преобразовываю его в растровые изображения. Поэтому, чтобы избежать ошибки OutOfMemory, я пытаюсь утилизировать растровые изображения. Но, к сожалению, я сталкиваюсь с другим исключением, говоря что-то вроде "View trying to use a recycled bitmap".

Но все же мне разрешено обнулять использованное растровое изображение, используя bitmap=null. Поэтому мой вопрос: поможет ли мое растровое изображение null освободить использованную память? или я должен предоставить bitmap.recycle() в другой части моего кода?

Ответы [ 3 ]

8 голосов
/ 07 июня 2011

Не существует гарантированного способа принудительного сбора мусора, только способ предложить один, использующий System.gc().Поскольку данные пикселей растрового изображения хранятся в собственной памяти вне кучи dalvik, предоставление собственной функции (в данном случае recycle()) даст нам возможность наверняка очистить эти данные пикселей (в конце концов).Обратите внимание, что при использовании recycle() с этим растровым изображением мало что можно сделать.

Проблема, с которой вы сталкиваетесь, заключается в том, что вы вызываете recycle() в растровом изображении, которое вы все еще пытаетесь использовать.

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

7 голосов
/ 07 июня 2011

Вызов recycle() указывает системе, что вы закончили использовать этот ресурс и что теперь система может освободить неуправляемую память, которую она использовала. После того, как вы утилизировали ресурс таким образом, его поведение обычно не определено (можно было бы ожидать, что он просто больше не будет работать).

Установка ссылки на нуль впоследствии имеет два преимущества:

  • У вас не будет устаревших ссылок на объекты, которые не будут работать при попытке их использования
  • Сборщик мусора будет знать, как очистить управляемую сторону растрового объекта, освобождая еще больше памяти
0 голосов
/ 06 февраля 2012

просто вызовите bitmap.recycle () для метода onStop ............ вы решите проблему ..

...