Я отправляю растровые изображения в свою активность из Сервиса (используя LocalBroadcastManager
и растровое изображение намерения)
Я установил их на ImageView
в действии следующим образом:
if (!bitmap.isRecycled) {
imageView.setImageBitmap(bitmap)
}
Когда мне больше не нужна служба, я закрываю ее и освобождаю растровый объект, хранящийся в этой службе.
Но когда я закрываю службу, я обычно получаю следующую ошибку:
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@fc4b896
Так чтоbitmap.isRecycled
условие здесь не поможет
Есть ли безопасный способ установить Bitmap в ImageView?
Я не сторонник использования фразы «пожалуйста, внимательно прочитайте вопрос». Читатели могут воспринять это как то, что вы называете кого-то идиотом. Он имеет довольно покровительственный и раздраженный тон, и его лучше избегать. Если вы хотите оставить отзыв о возможном дублировании, вы можете сказать: «Спасибо за предложение. Я проверил этот вопрос {только что/уже} и не думаю, что это дубликат, потому что {причина}». Это с большей вероятностью приведет к полезному разговору.
Ваше исключение говорит вам, что растровое изображение уже переработано, поэтому нет необходимости проверять приложение
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@fc4b896
вместо этого просто проверьте нулевое значение
Также проверьте документацию, почему вы получили ошибку
https://developer.android.com/reference/android/graphics/Bitmap#isRecycled()
Нет, здесь сказано, что вы не можете использовать переработанное изображение, потому что мы сделали его переработанным минуту назад.
Я не звоню Bitmap.recycle
дважды, только один раз. Так что я не понимаю вашего ответа, это не имеет никакого смысла
@ user155 Какую версию Studio вы используете.
Зачем спрашивать мою версию Studio? Как это может помочь?
Если вы используете версию 3.0 и выше, нет необходимости вызывать recycle(), потому что об этом позаботится GC. Если не работает, обрежьте растровое изображение до изображения SVG -> XML или WebP.
Я гуглил об этом. Дело не в Studio, а в версии ОС Android. Думаю, я просто удалю строку bitmap.recycle()
из своего проекта, чтобы решить эту проблему.
Когда вы используете imageView.setImageBitmap(bitmap)
, вы не должны перерабатывать растровое изображение после setImageBitmap
, потому что ваш imageView все еще ссылается на это растровое изображение и использует его. Вы можете переработать его, когда активность/фрагмент/представление будет уничтожено.
Поэтому у меня есть два варианта: установить setImageBitmap(null)
в ImageVIew
перед вызовом bitmap.recycle()
или удалить bitmap.recycle()
строку из кода. Кажется, лучше использовать второе решение, потому что Android >= 3.0 автоматически выпускает такие вещи.
p.s. моя деятельность жива, когда я закрываю свою службу. Так что он не уничтожается, когда я перерабатываю это растровое изображение.
Конечно, вы знаете свой проект лучше всех :D
Комментарий относительно потенциального дубликата, похоже, был удален, а закрытых голосов по этому вопросу нет, поэтому я удалил материал о потенциальном дубликате (в любом случае неясно, что было предложено в качестве дубликата).