2013-08-28 3 views
1

В документации под названием «Managing Bitmap Memory» вы можете найти следующее заявление:Bitmap.recycle() - «IllegalArgumentException: Не удается сделать переработанные растровые изображения»

Caution: You should use recycle() only when you are sure that the bitmap is no longer being used. If you call recycle() and later attempt to draw the bitmap, you will get the error: "Canvas: trying to use a recycled bitmap".

Итак, что же означает «больше не»?

Я вызываю setImageDrawable(drawable) в своих фрагментах onCreateView (...) метод. И я вызываю recycle() на растровое изображение drawable в onStop() фрагмента. Когда пользователь теперь покидает фрагмент, запуская другое действие, битмап перерабатывается. Но когда пользователь возвращается к предыдущему фрагменту, его onCreateView() вызывается снова, в результате чего появляется новый вызов «setImageDrawable (drawable)». И это бросает:

IllegalArgumentException: Cannot draw recycled bitmaps 

Таким образом, я все еще, кажется, находится в контексте «больше не». Когда я получу новое растровое изображение, которое не перерабатывается? Только после того, как фрагмент и его деятельность были полностью уничтожены?

+0

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

+1

Проблема заключается в следующем: приложение имеет несколько разделов. На планшете большинство разделов имеют фоновое изображение, которое заполняет экран. Поэтому загрузка такого изображения занимает много памяти. Когда пользователь переключается на другой раздел, предыдущее действие останавливается, а не немедленно уничтожается (изображение не является GCd). Поэтому переход в другой раздел загружает другое изображение в кучу (которая растет) и так далее. Я уже пробовал изображение при загрузке, но на самом деле это только задерживает ошибку OutOfMemory. –

+0

Поэтому я вызываю recycle() и Runtime.gc() в onStop(). Но это приводит к тому, что «Невозможно нарисовать переработанные растровые изображения», когда пользователь возвращается в этот раздел, который хочет загрузить то же (вторичное) изображение, что и раньше. –

ответ

1

So, what exactly means "no longer"?

Больше не означает, что вы не собираетесь использовать одну и ту же ссылку растрового изображения.

Как вы сказали, вы рециркуляция растровых изображений на OnStop(), попробуйте с этим также внутри OnStop()

if(bitmap!=null) 
    { 
     bitmap.recycle(); 
     bitmap=null; 
    } 

Bitmap and outOfMemory in android

Смотреть первые 20 minuts этого официального видео, если вы хотите сделать ваш день хороший - http://www.youtube.com/watch?v=_CruQY55HOk

+0

Привет, Тарун, я видел это видео. И у меня есть все. Я решил проблему сейчас, реализовав механизм кэширования, как описано в [Отображение битмапов эффективно] (http://developer.android.com/training/displaying-bitmaps/index.html). Поэтому при первоначальной загрузке изображения я помещаю его в кеш. Затем в onStop() я перерабатываю его, запускаю GC (-> frees memory), а позже, когда один и тот же фрагмент отображается снова, я загружаю изображение из кеша. Поскольку изображения действительно большие, я все же их отбираю. Поскольку это требует времени, имеет смысл хранить их в кэше диска дополнительно. –

+0

Тогда что вы сейчас испытываете? –