Glide — е библиотека за зареждане на изображения в Android, поддържана от Google чрез проекта Bumptech. Библиотеката осигурява ефективно зареждане на изображения, GIF анимации и видео кадри с автоматично управление на паметта. Според данни от GitHub хранилището на Glide, проектът се използва от над 200 000 приложения. Glide се препоръчва от Google като предпочитана библиотека за зареждане на графика в Android.
Основни точки
Glide — е библиотека за бързо и ефективно зареждане на изображения, анимирани GIF и видео кадри в Android приложения. Проектът се разработва от Bumptech под егидата на Google и се използва широко в официалните приложения на Google.
Вътрешната архитектура на Glide е изградена върху компонентен подход: Engine управлява изпълнението на заявки, DecodeJob отговаря за декодирането, а ResourceDecoder преобразува суровите данни в Bitmap или Drawable. Всеки етап може да бъде персонализиран чрез модули и регистри, което прави Glide изключително гъвкава библиотека за нестандартни формати на изображения.
За разлика от много конкуренти, Glide от самото начало е проектиран, като се вземат предвид особеностите на Android: жизненият цикъл на Activity и Fragment, завъртания на екрана, промени в конфигурацията. Библиотеката автоматично спира и възобновява зарежданията в зависимост от състоянието на компонента.
Според Android Developers, Glide е препоръчителната библиотека за зареждане на изображения в официалната документация на Google. Използва се в приложенията Google Play, Google Maps и други продукти на компанията, което потвърждава нейната надеждност и производителност.
Ключовата разлика на Glide от аналозите — автоматичното мащабиране на изображения до размера на ImageView. Ако Picasso зарежда изображението в пълна разделителна способност и след това го мащабира, Glide декодира файла директно в необходимия размер. Това намалява пиковата консумация на памет и ускорява показването в списъци с различни размери на клетките.
Glide предоставя широк набор от функции за работа с изображения, покриващ както прости, така и сложни сценарии за зареждане на съдържание.
GIF и анимирани WebP Glide зарежда и показва толкова лесно, колкото статични изображения. Библиотеката автоматично разпознава формата по MIME тип и декодира анимацията, показвайки кадрите във фонова нишка. За управление на възпроизвеждането са налични методите asGif и asBitmap.
Glide автоматично се свързва с жизнения цикъл на Activity, Fragment и View. При пауза на Activity зарежданията се спират, при унищожаване — отменят. Това предотвратява изтичане на памет и зареждане на изображения за вече затворени екрани. Интеграцията работи чрез поддръжка на LifecycleOwner.
Glide може да извлича кадри от видео по URL или локален път. За това се използва методът asBitmap() в комбинация с load() за видео URI. Glide автоматично избира ключов кадър или кадър по зададено времево клеймо. Това е полезно за показване на преглед на видео.
GlideApp — е генериран клас, който предоставя разширен API въз основа на конфигурацията на AppGlideModule. С негова помощ могат да се използват методи, недостъпни в стандартния Glide.with: зареждане с персонализирани опции по подразбиране, интеграция с библиотеки и предварително зададени трансформации. За генериране е необходима анотация @GlideModule в клас, наследяващ AppGlideModule.
Glide използва многослойна архитектура с двигател, декодери, трансформации и кеш. Всяка заявка преминава през верига от обработващи програми, които оптимизират зареждането за конкретен ImageView.
При извикване на into(view) Glide проверява кеша: активни ресурси, кеш в RAM, дисков кеш и едва след това мрежата. Изображението автоматично се мащабира до размера на целевия ImageView, като се вземат предвид плътността на екрана и scaleType. Това намалява използването на памет — ключовото предимство на Glide.
Glide.with(context)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.override(400, 300)
.centerCrop()
.into(imageView)
Инсталиране на Glide се извършва чрез Gradle. Библиотеката изисква конфигурация чрез AppGlideModule за генериране на API. Минимална версия на Android API — 21.
В build.gradle добавете Glide с kapt обработчик на анотации за генериране на GlideApp API. За Kotlin използвайте kapt вместо annotationProcessor. Версия Glide 4.16+ работи стабилно с Android Gradle Plugin 8.x.
dependencies {
implementation "com.github.bumptech.glide:glide:4.16.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.16.0"
}
// За Kotlin използвайте kapt
// kapt "com.github.bumptech.glide:compiler:4.16.0"
AppGlideModule — задължителен компонент за настройка на Glide. Той позволява задаване на размер на кеша, персонализиран HttpStack и регистриране на собствени декодери. Модулът се сканира от Glide при стартиране на приложението. Анотацията @GlideModule го регистрира автоматично.
@GlideModule
public class MyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSize = 250 * 1024 * 1024;
builder.setDiskCache(
new DiskLruCacheFactory(cacheDir.getPath(), diskCacheSize)
);
}
}
Примерите по-долу демонстрират типични сценарии: зареждане на изображение, работа с GIF и извличане на видео кадър.
Основно зареждане чрез Glide.with().load().into() — минимален код за показване на изображение от мрежата. Glide автоматично настройва размера на ImageView. Placeholder се показва по време на зареждане, а error — при грешка.
Glide.with(fragment)
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
GIF се зарежда като статично изображение — Glide автоматично разпознава формата по типа на съдържанието. За принудително зареждане като статично изображение използвайте asBitmap(), за GIF — asGif(). Glide ефективно декодира само видимите кадри.
Glide.with(context)
.asGif()
.load("https://example.com/animation.gif")
.into(imageView)
// Зареди първия кадър на GIF като статично изображение
Glide.with(context)
.asBitmap()
.load("https://example.com/animation.gif")
.into(imageView)
Видео кадър се извлича от Glide по URI на локално или отдалечено видео. По подразбиране Glide зарежда ключовия кадър. За посочване на конкретно времево клеймо се използва frameMillis. Това е удобно за показване на преглед в галерия с видеа.
String videoUrl = "https://example.com/video.mp4";
Glide.with(context)
.asBitmap()
.load(videoUrl)
.override(200, 200)
.into(imageView)
Оптимизиране на Glide за RecyclerView — критично умение при разработка на приложения с голям брой изображения. Правилната конфигурация предотвратява забавяния и OOM грешки.
Една от ключовите възможности на Glide — интеграция с RecyclerView чрез RecyclerViewPreloader. Този компонент анализира скоростта на превъртане и посоката на движение, предварително зареждайки изображения, които ще се появят на екрана след няколко елемента. За работа с презареждача е необходимо да се имплементира интерфейсът PreloadSizeProvider и да се предаде на конструктора заедно с целевия ImageView.
Използването на метода override() с точни размери на ImageView значително ускорява зареждането. Когато Glide знае точния размер на целта, може да декодира изображението директно в необходимата разделителна способност, пропускайки етапа на мащабиране. Това съкращава времето за декодиране и намалява пиковата консумация на памет с 30–40%.
За потоци с разнородно съдържание използвайте различни RequestOptions за всеки тип елемент. Например за големи банер изображения можете да зададете override(1200, 600) и качество RGB_565, а за аватари — override(200, 200) и заобляне чрез transform. Такъв подход позволява оптимално използване на ресурсите за всеки тип съдържание.
Glide предоставя гъвкави възможности за обработка на грешки чрез error изображения и персонализиран RequestListener. RequestListener позволява реагиране на успешно зареждане или грешка, регистриране на повреди или изпращане на аналитика. Може също да се конфигурира fallback — изображение, което се показва, когато load() получи null вместо връзка.
Използвайте RecyclerViewPreloader за предварително зареждане на изображения, преди потребителят да превърти до тях. Glide поддържа интеграция с RecyclerView чрез презареждач, който анализира скоростта на превъртане и зарежда изображения предварително.
Thumbnail мултипликация позволява първо да се покаже намалена версия на изображението, а след това да се зареди пълното. Извикването thumbnail(0.25f) зарежда версия от 25% от размера, която се показва веднага, а изображението в пълен размер се зарежда по-късно. Това създава усещане за мигновено зареждане.
За списъчни адаптери използвайте .override() с точни размери на ImageView, за да не мащабира Glide изображението всеки път. Това намалява натоварването на CPU и консумацията на памет. Размерът на кеша се избира експериментално, но 250 MB за диск и 20% от наличната памет са добра отправна точка.
Често задавани въпроси
Glide поддържа GIF, видео кадри и анимирани WebP. Той управлява паметта по-ефективно и се препоръчва от Google. Picasso е по-малък и по-лесен за използване. За сложни проекти изберете Glide.
Glide приема LifecycleOwner (Fragment, Activity) или View. Библиотеката автоматично следи състоянието чрез LifecycleObserver: спира зареждането при пауза и го отменя при унищожаване, предотвратявайки изтичания.
Да, използвайте asBitmap() преди load(). Glide ще зареди GIF като статично изображение и ще покаже само първия кадър. Това е полезно за списъци, където GIF анимацията е нежелателна поради производителност.
Кешът на Glide се състои от три нива: активни ресурси (в момента използвани), RAM (LRU кеш) и диск (LruCache). Изображенията, заредени от кеша, се показват незабавно. Кешът автоматично се изчиства при недостиг на памет.
Персонализиран HTTP клиент се регистрира чрез OkHttpUrlLoader в AppGlideModule. Презапишете registerComponents и регистрирайте своя OkHttpClient. Това позволява добавяне на прихващачи, сертификати и персонализирани таймаути.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също