В документации под названием «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
Таким образом, я все еще, кажется, находится в контексте «больше не». Когда я получу новое растровое изображение, которое не перерабатывается? Только после того, как фрагмент и его деятельность были полностью уничтожены?
Ваше растровое изображение будет автоматически сгенерировано автоматически, когда вы покинете активность (если у вас нет долгой ссылки на него). Если вам не нужно управлять многими растровыми изображениями, пока актив активен (для управления памятью), нет необходимости вручную их перерабатывать. – dymmeh
Проблема заключается в следующем: приложение имеет несколько разделов. На планшете большинство разделов имеют фоновое изображение, которое заполняет экран. Поэтому загрузка такого изображения занимает много памяти. Когда пользователь переключается на другой раздел, предыдущее действие останавливается, а не немедленно уничтожается (изображение не является GCd). Поэтому переход в другой раздел загружает другое изображение в кучу (которая растет) и так далее. Я уже пробовал изображение при загрузке, но на самом деле это только задерживает ошибку OutOfMemory. –
Поэтому я вызываю recycle() и Runtime.gc() в onStop(). Но это приводит к тому, что «Невозможно нарисовать переработанные растровые изображения», когда пользователь возвращается в этот раздел, который хочет загрузить то же (вторичное) изображение, что и раньше. –