Ответ
Недавно работал над оптимизацией загрузки изображений в RecyclerView. Использовал Glide с кастомными параметрами:
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error_placeholder)
.into(imageView)
Добавил prefetch для предзагрузки изображений при скролле и реализовал отмену загрузки при быстром скроллинге через clear(). Это уменьшило лаги списка на слабых устройствах на 30%. Также добавил переход на WebP для уменьшения размера изображений на сервере.
Ответ 18+ 🔞
А, слушай, вот тут история про оптимизацию картинок в списках — просто пиздец как актуально. Ну представь себе: скроллишь ленту, а она дёргается, будто на дворе 2002-й год, ёпта. Картинки грузятся, а телефон уже в агонии, вротберунчик, лаги такие, что волнение ебать.
Так вот, взял я этот Glide, ну, стандартно же все его юзают. Но если его просто так, в лоб, настроить — это ж манда с ушами получается. Картинка пришла — рисуем, ещё не пришла — ждём, а юзер уже вниз проскроллил. Терпения ноль ебать у людей, они сразу свайпают дальше.
Короче, смотри, что я сделал. Во-первых, кэш. Без него нихуя не работает. Ставлю DiskCacheStrategy.ALL — это чтобы всё, что скачалось, и в оперативке, и на диске лежало. Потом, если туда-сюда скроллить, картинки из кэша мгновенно достаются, а не снова с интернета тащатся. Экономия трафика — огонь, и скорость — просто овердохуища.
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error_placeholder)
.into(imageView)
Во-вторых, prefetch. Это такая хитрая жопа. Пока юзер пялится на первые три картинки, Glide уже втихую начинает грузить четвёртую, пятую, шестую. То есть он заранее готовит, чувак. Скроллишь — а они уже почти загружены, осталось только отрендерить. Лаги сокращаются конкретно.
А самое главное — отмена загрузки при быстром скролле. Ну, знаешь, листаешь быстро, а он всё равно тянет с сервера те картинки, которые уже не нужны. Тупой расход ресурсов. Так вот, в адаптере, в onBindViewHolder, перед новой загрузкой, я делаю Glide.clear(holder.imageView). Старую задачу отменяет, новую начинает. Без этого — пизда рулю, память сожрёт и всё будет тормозить.
В итоге, после всех этих плясок с бубном, лаги на слабых девайсах упали на 30%. Серьёзно. Не ни хуя себе, а реально ощутимо.
Ну и вишенка на торте — перегнал всё на WebP на бэкенде. Картинки стали весить в полтора-два раза меньше, грузится всё быстрее. А Glide его из коробки поддерживает, ему вообще похуй, что за формат. Главное, чтоб URL был правильный.
В общем, вывод простой: можно взять даже стандартную библиотеку, но если её грамотно, с мозгами, настроить — результат будет на порядок лучше. А если в лоб — получится полупидорское решение, которое только вид портит.