Проверка того, переработано ли растровое изображение, не помогает решить «RuntimeException: Canvas: попытка использовать переработанное растровое изображение»

Я отправляю растровые изображения в свою активность из Сервиса (используя 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?

Комментарий относительно потенциального дубликата, похоже, был удален, а закрытых голосов по этому вопросу нет, поэтому я удалил материал о потенциальном дубликате (в любом случае неясно, что было предложено в качестве дубликата).

halfer 29.05.2019 20:16

Я не сторонник использования фразы «пожалуйста, внимательно прочитайте вопрос». Читатели могут воспринять это как то, что вы называете кого-то идиотом. Он имеет довольно покровительственный и раздраженный тон, и его лучше избегать. Если вы хотите оставить отзыв о возможном дублировании, вы можете сказать: «Спасибо за предложение. Я проверил этот вопрос {только что/уже} и не думаю, что это дубликат, потому что {причина}». Это с большей вероятностью приведет к полезному разговору.

halfer 29.05.2019 20:18
0
2
712
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@fc4b896

вместо этого просто проверьте нулевое значение

Также проверьте документацию, почему вы получили ошибку

https://developer.android.com/reference/android/graphics/Bitmap#isRecycled()

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

user155 29.05.2019 09:11

Я не звоню Bitmap.recycle дважды, только один раз. Так что я не понимаю вашего ответа, это не имеет никакого смысла

user155 29.05.2019 09:15

@ user155 Какую версию Studio вы используете.

Ankit Tale 29.05.2019 09:15

Зачем спрашивать мою версию Studio? Как это может помочь?

user155 29.05.2019 09:16

Если вы используете версию 3.0 и выше, нет необходимости вызывать recycle(), потому что об этом позаботится GC. Если не работает, обрежьте растровое изображение до изображения SVG -> XML или WebP.

Ankit Tale 29.05.2019 09:17

Я гуглил об этом. Дело не в Studio, а в версии ОС Android. Думаю, я просто удалю строку bitmap.recycle() из своего проекта, чтобы решить эту проблему.

user155 29.05.2019 09:23
Ответ принят как подходящий

Когда вы используете imageView.setImageBitmap(bitmap), вы не должны перерабатывать растровое изображение после setImageBitmap, потому что ваш imageView все еще ссылается на это растровое изображение и использует его. Вы можете переработать его, когда активность/фрагмент/представление будет уничтожено.

Поэтому у меня есть два варианта: установить setImageBitmap(null) в ImageVIew перед вызовом bitmap.recycle() или удалить bitmap.recycle() строку из кода. Кажется, лучше использовать второе решение, потому что Android >= 3.0 автоматически выпускает такие вещи.

user155 29.05.2019 09:26

p.s. моя деятельность жива, когда я закрываю свою службу. Так что он не уничтожается, когда я перерабатываю это растровое изображение.

user155 29.05.2019 09:30

Конечно, вы знаете свой проект лучше всех :D

Bach Vu 29.05.2019 09:30

Другие вопросы по теме