Введение
«Какую библиотеку загрузки изображений вы используете и почему?» — вопрос, который задают почти на каждом Android-собеседовании. И кандидат, который отвечает «ну, Glide, наверное», — сразу минус. Интервьюер ждёт не название, а понимание: что библиотека делает под капотом и чем отличаются варианты.
Загрузка картинки по URL — на первый взгляд тривиальная задача: скачал байты, показал в ImageView. Но в реальном проекте за ней тянется целый список проблем: кэширование в памяти и на диске, сжатие и ресайз под размер View, обработка списков, где картинок сотни, а сеть медленная. Именно это решают библиотеки — Glide, Picasso и Coil.
Вопрос «Glide или Coil?» — это ещё и вопрос эпох: Glide — проверенный временем стандарт, Coil — Kotlin-first новичок, который пришёл с Compose, а Picasso — легенда, которую официально заархивировали. Разберём каждую по фактам.
Что проверяет интервьюер
Вопрос про загрузку изображений проверяет широту кругозора: знаете ли вы, чем библиотеки отличаются архитектурно (Kotlin-first, корутины, Compose), следите ли за статусом инструментов и понимаете ли, зачем вообще нужны кэш и ресайз. Названия библиотек знают все, причины — немногие.
Зачем нужна библиотека
Наивный способ загрузки картинки — URL.openStream() в потоке и BitmapFactory.decodeStream(). Он работает ровно до первого реального экрана: сетевой вызов на главном потоке, нет кэша, нет обработки поворотов камеры, нет учета размера экрана. Отсюда и задачи, которые решают все три библиотеки:
- Сеть: скачивание в фоне, правильный
Content-Type, обработка ошибок и отмен. - Память и диск: двухуровневый кэш, чтобы одна и та же картинка не скачивалась и не декодировалась повторно.
- Ресайз: даунсемплинг (уменьшение разрешения) под размер View, а не декодирование гигантского bitmap целиком.
- Жизненный цикл: отмена запросов, когда View уходит с экрана или Activity уничтожается.
- Форматы: GIF, видео-кадры, SVG — не из коробки везде.
Все три библиотеки закрывают эти пункты, но с разной философией. Glide, по словам его создателей, — «фреймворк управления медиа и загрузки изображений для Android», с фокусом на плавный скролл списков. Coil — «библиотека загрузки изображений для Android и Compose Multiplatform», спроектированная вокруг Kotlin. Picasso — «мощная библиотека скачивания и кэширования изображений», которая в 2020-х осталась позади.
Типичная ошибка на собеседовании: кандидат перечисляет названия, но не может объяснить, что делает библиотека «под капотом». Запомните четыре слова: сеть, кэш, ресайз, жизненный цикл. Если вы озвучите их и поясните каждое — ответ уже на уровне выше среднего.
Glide: стандарт индустрии
Glide от команды bumptech (сейчас развивается при участии Google) — самая распространённая библиотека загрузки изображений в Android. На странице проекта она описана как «быстрый и эффективный фреймворк управления медиа и загрузки изображений, который оборачивает декодирование, кэширование в памяти и на диске и пулинг ресурсов в простой интерфейс».
Ключевые факты, которые стоит знать:
- Поддерживает не только статичные картинки, но и анимированные GIF и кадры видео.
- Сетевой стек подключаемый: по умолчанию свой на
HttpUrlConnection, но есть готовые интеграции с OkHttp и Volley. - Главный фокус — плавная прокрутка списков с изображениями: именно для этого сделаны ресайз под размер View, кэш и пулинг.
- Лицензия — BSD (с элементами MIT и Apache 2.0), по состоянию на сегодня актуальная версия 5.x.
Базовый пример выглядит так:
Glide.with(imageView.context)
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.ic_placeholder)
.error(R.drawable.ic_error)
.centerCrop()
.into(imageView)Строка Glide.with(...) привязывает запрос к жизненному циклу: если переданный Activity или Fragment уничтожен, запрос отменяется. placeholder и error — заглушки на время загрузки и при сбое. centerCrop — кроп под размер ImageView, который заодно подсказывает Glide, какого размера bitmap ему нужен.
Уровня кэша
Память → диск → сеть. Glide сначала ищет картинку в памяти, затем на диске, и только потом идёт в сеть. Благодаря этому повторный показ одного URL не стоит ни одного сетевого запроса — а это главное для списков.
На собеседовании про Glide стоит сказать: «де-факто стандарт, огромное комьюнити, отлично работает со списками, но API построен вокруг Java и флуент-цепочки, что в Kotlin-проекте выглядит тяжеловато».
Coil: Kotlin-first и Compose
Coil (coil-kt/coil) — библиотека нового поколения. Её позиционирование прямо из README: «библиотека загрузки изображений для Android и Compose Multiplatform». И четыре характеристики, которые она про себя заявляет:
- Fast: кэш в памяти и на диске, даунсемплинг, автоматическая пауза и отмена запросов.
- Lightweight: зависит только от Kotlin, Coroutines и Okio, дружит с R8-сжатием.
- Easy to use: API построено на возможностях Kotlin, минимум бойлерплейта.
- Modern: Kotlin-first, интегрируется с Compose, Coroutines, Okio, OkHttp и Ktor.
Расшифровка названия — Coroutine Image Loader: вся внутренняя механика построена на корутинах, а не на собственном пуле потоков. Это не маркетинговая деталь, а архитектурное отличие от Glide.
Лицензия Coil — Apache 2.0. В версии 3.x пакеты переехали в coil3.*, а сетевой движок вынесен в отдельный модуль coil-network-okhttp — это стоит упомянуть, если пишете про него в резюме.
// View system: одна строка вместо цепочки
imageView.load("https://example.com/photo.jpg")// Compose: AsyncImage из coil-compose
AsyncImage(
model = "https://example.com/photo.jpg",
contentDescription = "Фото профиля",
modifier = Modifier.size(64.dp)
)Одно из главных преимуществ Coil — нативная работа с Compose: AsyncImage умеет перезагружать модель, отменять загрузку при выходе из композиции и корректно переживать рекомпозицию. Для проектов на Compose это решающий аргумент.
Почему это спрашивают: «Coil или Glide?» — излюбленный вопрос интервьюеров. Хороший ответ: «Coil — Kotlin-first, легче, встроен в Compose; Glide — проверенный стандарт с большим комьюнити, лучше если нужны GIF/видео-кадры из коробки и глубокие кастомные интеграции». Никто не ждёт «Coil, потому что модно».
Picasso: легенда, которую заархивировали
Picasso от Square — «мощная библиотека скачивания и кэширования изображений для Android», выпущенная в 2013 году и завоевавшая индустрию: 18+ тысяч звёзд, Apache 2.0, минималистичный API. Версия 2.8 требует Java 8 и API 21. Код выглядел так:
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.ic_placeholder)
.error(R.drawable.ic_error)
.into(imageView)Но история Picasso — это ещё и урок про эволюцию инструментов. На странице проекта сейчас прямо написано: библиотека deprecated, для новых проектов рекомендуется Coil, новых релизов в Maven Central не будет, а существующие версии продолжат работать без поддержки.
Урок для собеседования
Picasso — пример того, как инструмент, который был стандартом, перестаёт развиваться: Java-архитектура, собственный пул потоков, никакой нативной поддержки Compose. Упоминание статуса Picasso на собеседовании показывает, что вы следите за экосистемой, а не выучили список библиотек в 2021 году.
Если проект ещё живёт на Picasso и работает — менять его насильно не нужно, существующие версии стабильны. Но для нового кода ответ интервьюеру звучит однозначно: Picasso не выбирают, Glide или Coil — да.
Что выбрать и что отвечать
Сводка по фактам — и сразу структура ответа на собеседовании.
| Критерий | Glide | Picasso | Coil |
|---|---|---|---|
| Статус | Активно развивается (5.x) | Deprecated, без новых релизов | Активно развивается (3.x) |
| Язык | Java-ориентированный API | Java-ориентированный API | Kotlin-first |
| Движок | Собственный пул + подключаемый стек | Собственный пул потоков | Корутины + Okio |
| Compose | Отдельный модуль, позже | Нет нативной поддержки | AsyncImage из коробки |
| Форматы | GIF, видео-кадры из коробки | Базовые | Модули coil-gif, coil-video, coil-svg |
| Лицензия | BSD (частично MIT/Apache 2.0) | Apache 2.0 | Apache 2.0 |
Правильный ответ на собеседовании строится так:
- Зачем вообще библиотека: сеть + двухуровневый кэш + ресайз + жизненный цикл.
- Glide — стандарт индустрии для View system, лучший для списков и GIF, но API не Kotlin-first.
- Coil — Kotlin-first, на корутинах, минимум зависимостей, нативный Compose. Для нового проекта и для Compose — первый выбор.
- Picasso — историческая легенда, официально deprecated, не берём в новые проекты.
- Практика: если проект на Compose — Coil; если большой легаси на View и нужны GIF/видео — Glide.
- Чек-лист перед собеседованием:
- Три уровня кэша и зачем нужен даунсемплинг под размер View.
- Отмена запросов по жизненному циклу — у Glide через
with(), у Coil через корутины. - Coil = Coroutine Image Loader: зависимость только от Kotlin, Coroutines и Okio.
- Статус Picasso: deprecated, Square рекомендует Coil для новых проектов.
- Ссылки на источники: bumptech/glide, coil-kt/coil, square/picasso.
Не забывайте и про смежную тему — сетевой стек. Библиотеки изображений ходят по сети, поэтому интервьюер может свернуть к OkHttp: переиспользование соединений, кэш по HTTP-заголовкам, перехватчики. Если ответите и про это — вопрос про картинки закрыт с запасом.
Вопрос про выбор библиотеки — один из тех, где видна разница между «заучил список» и «понимаю экосистему». Кандидат уровня middle обычно не просто называет Coil, а объясняет, чем он лучше для его стека. Если такие связки тем даются с трудом — это не про память, а про системное видение, и его как раз тренируют на мок-собеседованиях. Я — Рустем Бикбулатов, senior Android-разработчик и ментор Яндекс Практикума: на разборах мы проходим именно такие связки «библиотека → сеть → архитектура».
Хотите понять, что мешает перейти на middle?
Бесплатная диагностика: разберу ваши пробелы в Kotlin, Coroutines и архитектуре и составлю план роста за 30–40 минут. Без обязательств — если менторство вам не подойдёт, честно скажу.
Итоги
Загрузка изображений — простая на первый взгляд тема, которая на собеседовании раскрывается в полноценный разговор об экосистеме: статусы библиотек, архитектурные решения, связка с Compose и сетью. Зафиксируем главное.
- Зачем библиотеки: сеть, двухуровневый кэш, ресайз под View, отмена по жизненному циклу — четыре причины, почему руками это не пишут.
- Glide — стандарт для View system: GIF, видео-кадры, интеграции с OkHttp, но не Kotlin-first. Coil — Kotlin-first, на корутинах, нативный Compose, три зависимости. Picasso — deprecated, для новых проектов не выбирается.
- Ответ уровня middle: не название, а обоснованный выбор под стек проекта со ссылкой на статус и архитектуру библиотеки.
Главное
Вопрос «какую библиотеку выберете» — это вопрос про системное мышление: вы видите не название, а архитектуру, статус и место инструмента в экосистеме. Кандидат, который может обосновать выбор — уже звучит как middle.
Если темы вроде этой «знаю, но сформулировать не могу» — это типичная граница junior→middle, и её закрывают практикой объяснений. Напишите в Telegram — разберём вашу ситуацию и составим план подготовки.