Предупреждение с использованием Glide в Recyclerview
Я только что начал переходить из Universal Image Loader в Glide. Однако при прокрутке вниз и снова в recyclerview я получаю массу предупреждающих сообщений.
W/Bitmap: Called reconfigure on a bitmap that is in use! This may cause graphical corruption!
Если я заменил Glide для другой библиотеки загрузки изображений, предупреждение исчезнет. Код в bindViewHolder, связанный с изображениями:
Glide.with(viewHolder.imageView.getContext())
.load(DisplayImageUtil.getImageUrl(item.getImageUrl(), 600))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder.imageView);
Протестировано на Nexus 5.
Ответы
Ответ 1
Я запускаю ту же проблему после первого запуска моего приложения на Android M (Nexus 5x).
EDIT: после открытия проблемы на Glide Github - https://github.com/bumptech/glide/issues/743, я обнаружил, что мое решение orignal "не решила проблему, только скрыть сообщения. Предупреждение исходит от Android Bitmap, и это связано с тем, что Glide повторно использует растровое изображение для лучшей производительности.
Ответ 2
Об этом говорится здесь,
Обычно это результат неправильного использования битмапов, либо путем возврата Растровое изображение в пул несколько раз без промежуточного get или ссылаясь на битмап после вызова clear() на соответствующем Target. Если у вас есть пользовательские преобразования, это хорошее место для внимательно посмотрите, чтобы убедиться, что вы не возвращаете битмап в пул дважды. Вы можете узнать больше об этой проблеме в wiki: https://github.com/bumptech/glide/wiki/Resource-re-use-in-Glide.
Журнал, который вы видите, находится в блоке catch (пойманное исключение). Убедитесь, что вы:
- Не пытаться загрузить 2 растровых изображения в одном целевом представлении
- Не очистка ресурса для повторного использования целевого представления, но сохранение ссылки на ресурс
так как вы используете recyclerView, вероятно, вторая точка верна, то есть перерабатывает представление, удерживая все ссылки на растровые изображения.
Ответ 3
Попробуйте вызвать Glide.clear() перед загрузкой изображения.
Glide.clear(viewHolder.imageView);
Glide.with(viewHolder.imageView.getContext())
.load(DisplayImageUtil.getImageUrl(item.getImageUrl(), 600))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder.imageView);
Надеюсь на эту помощь.
Ответ 4
Я получал предупреждение и графическую коррупцию. Это было в виде обрезанных растровых изображений, появляющихся сверху и снизу просмотра ресайклера и оставаясь там, если прокрутка слишком быстро.
Помещение изображения в макет фрейма избавилось от графического искажения.
Ответ 5
Вы можете очищать журналы с помощью фильтров Logcat на Android Studio.
Добавить ^(?!AbsListView|IInputConnectionWrapper|ApplicationPackageManager|Bitmap|ViewRootImpl)
в Regex фильтра Android Logcat.