Почти в каждом втором приложении на Android приходится иметь дело с изображениями: аватарки пользователей, карточки товаров, баннеры. Однако, если загружать картинки из сети вручную, легко столкнуться с утечками памяти, долгой загрузкой и нехваткой дискового пространства. Glide — это библиотека, которая берёт на себя всю грязную работу: фоновую загрузку, сжатие изображений, кэширование в памяти и на диске, а также привязку к жизненному циклу Android-компонентов.
Добавляем Glide в проект
Чтобы начать работу с Glide в вашем Android-приложении, откройте файл build.gradle.kts уровня модуля и добавьте строчку с зависимостью. На момент написания статьи актуальна версия 4.16.0, она стабильно работает на всех устройствах начиная с API 21.
dependencies {
implementation("com.github.bumptech.glide:glide:4.16.0")
}
Для работы с Kotlin-кодом дополнительных модулей не требуется — библиотека изначально хорошо дружит с этим языком. Если вы используете аннотации для генерации API Glide, подключите ещё compiler через ksp, но для базового использования хватит одной строки.
Простейшая загрузка изображения
Минимальный код, чтобы загрузить картинку по URL и отобразить её в ImageView, состоит из трёх методов: with, load и into. Метод with принимает контекст (Activity, Fragment или View), load — ссылку на изображение, а into — целевой ImageView.
Glide.with(this)
.load("https://example.com/photo.jpg")
.into(imageView)
Этого достаточно для простого отображения. Библиотека сама запустит фоновый поток, скачает изображение, сожмёт его до размеров ImageView и закэширует. При повторном открытии экрана картинка загрузится мгновенно из кэша.
Placeholder и обработка ошибок
Пока изображение грузится, экран не должен выглядеть пустым. Для этого задают placeholder — картинку-заглушку, которая показывается до окончания загрузки. На случай ошибки (нет интернета, битая ссылка) есть error. Обе опции принимают ресурсы из папки drawable.
Glide.with(this)
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.ic_placeholder)
.error(R.drawable.ic_error)
.into(imageView)
Можно также переопределить поведение при ошибке через listener. Он возвращает два колбэка: onResourceReady (успех) и onLoadFailed (ошибка). Если вернуть true из onLoadFailed, Glide не будет показывать стандартную заглушку ошибки.
Работа с разными источниками изображений
Метод load принимает не только URL-строку. Glide умеет загружать изображения практически из любых источников:
- Локальный ресурс:
load(R.drawable.my_image). - Файл на устройстве:
load(File("/sdcard/photo.jpg")). - Uri контента:
load(contentUri)для изображений из галереи. - Байтовый массив:
load(byteArray)для загрузки из оперативной памяти.
Библиотека сама определяет тип переданного объекта и выбирает подходящий загрузчик. Если источник не поддерживается, ничего страшного не произойдёт — просто изображение не отобразится.
Трансформации: изменяем размер и форму
Часто картинка с сервера приходит в огромном разрешении, а на экране ей отведён небольшой квадрат. Чтобы избежать лишнего расхода памяти, задают конкретные размеры через override и способ масштабирования через centerCrop или fitCenter.
Glide.with(this)
.load("https://example.com/large.jpg")
.override(300, 300)
.centerCrop()
.into(imageView)
Для более сложных преобразований — скругление углов, перевод в чёрно-белый, размытие — создают свой класс, наследующий BitmapTransformation, и передают его через метод transform. Это особенно полезно в новостных лентах и карточках товаров, где изображения должны выглядеть единообразно.
Кэширование и управление памятью
Одна из главных фишек Glide — умный кэш. По умолчанию библиотека кэширует изображения и в оперативной памяти, и на диске, автоматически очищая старые данные при нехватке места. Однако бывают ситуации, когда кэш нужно отключить.
Glide.with(this)
.load("https://example.com/dynamic.jpg")
.skipMemoryCache(true) // не кэшировать в памяти
.diskCacheStrategy(DiskCacheStrategy.NONE) // не кэшировать на диске
.into(imageView)
Параметр diskCacheStrategy принимает четыре значения: AUTOMATIC (по умолчанию), ALL, RESOURCE, DATA и NONE. Для большинства приложений стандартного AUTOMATIC достаточно, но если картинка часто обновляется на сервере, можно оставить только кэш в памяти, чтобы не показывать устаревшую версию.
Приоритет загрузки
Когда на экране много изображений, важно управлять очерёдностью их загрузки. Метод priority задаёт приоритет конкретной картинки: IMMEDIATE (загрузить немедленно), HIGH, NORMAL и LOW. Например, верхним видимым элементам списка можно поставить HIGH, а тем, что далеко внизу — LOW, чтобы не тратить трафик пользователя на изображения, которые он, возможно, никогда не увидит.
Glide в Jetpack Compose
Если вы используете Compose вместо классических View, для Glide есть специальный компонент GlideImage, который работает внутри Composable-функций.
GlideImage(
model = "https://example.com/photo.jpg",
contentDescription = "Описание фото"
)
Этот компонент сам управляет состоянием загрузки и автоматически обновляет интерфейс при завершении. Для работы с GlideImage добавьте зависимость com.github.bumptech.glide:compose:1.0.0-beta.1. Если вы предпочитаете Coil, там аналогичный компонент называется AsyncImage.
Ключевые методы Glide в одной таблице
| Метод | Назначение | Пример |
|---|---|---|
| with() | Задаёт контекст (Activity, Fragment) | Glide.with(this) |
| load() | Указывает источник изображения | .load("https://...") |
| into() | Целевой ImageView для отображения | .into(imageView) |
| placeholder() | Заглушка на время загрузки | .placeholder(R.drawable.plh) |
| error() | Изображение при ошибке загрузки | .error(R.drawable.err) |
| override() | Задаёт конкретные размеры в пикселях | .override(300, 300) |
| centerCrop() | Масштабирует и обрезает по центру | .centerCrop() |
| diskCacheStrategy() | Стратегия кэширования на диске | .diskCacheStrategy(ALL) |
Советы начинающим
- Всегда используйте
placeholder. Пустой ImageView раздражает пользователя и создаёт ощущение, что приложение зависло. - Не забывайте про разрешение INTERNET. Без
<uses-permission android:name="android.permission.INTERNET"/>в манифесте ни одно изображение из сети не загрузится. - Выносите URL в ресурсы или константы. Ссылки на изображения лучше хранить отдельно от кода, чтобы при смене домена не перелопачивать весь проект.
- Проверяйте размеры. Если картинка выглядит размытой, возможно,
overrideзадан слишком маленьким. Если приложение тормозит — слишком большим.
Что мы освоили
Библиотека Glide закрывает практически все потребности Android-разработчика в работе с изображениями. Вы научились подключать её к проекту, загружать картинки из сети и локальных ресурсов, обрабатывать ошибки, трансформировать изображения и управлять кэшем. Теперь можно смело браться за создание новостной ленты, галереи или карточек товаров — Glide возьмёт на себя всю сложность работы с графикой.