Glide — to biblioteka do ładowania obrazów w Android, wspierana przez Google poprzez projekt Bumptech. Biblioteka zapewnia efektywne ładowanie obrazów, animacji GIF i klatek wideo z automatycznym zarządzaniem pamięcią. Według danych repozytorium GitHub Glide, projekt jest używany przez ponad 200 000 aplikacji. Glide jest rekomendowany przez Google jako preferowana biblioteka do ładowania grafiki w Android.
Najważniejsze
Glide — to biblioteka do szybkiego i efektywnego ładowania obrazów, animowanych GIF i klatek wideo w aplikacjach Android. Projekt jest rozwijany przez Bumptech pod egidą Google i szeroko stosowany w oficjalnych aplikacjach Google.
Wewnętrzna architektura Glide opiera się na podejściu komponentowym: Engine zarządza wykonywaniem zapytań, DecodeJob odpowiada za dekodowanie, a ResourceDecoder przekształca surowe dane w Bitmap lub Drawable. Każdy etap można dostosować poprzez moduły i rejestry, co czyni Glide niezwykle elastyczną biblioteką dla niestandardowych formatów obrazów.
W przeciwieństwie do wielu konkurentów, Glide od samego początku był projektowany z uwzględnieniem specyfiki Android: cykl życia Activity i Fragment, obroty ekranu, zmiana konfiguracji. Biblioteka automatycznie wstrzymuje i wznawia ładowanie w zależności od stanu komponentu.
Według Android Developers, Glide — rekomendowana biblioteka do ładowania obrazów w oficjalnej dokumentacji Google. Jest używana w aplikacjach Google Play, Google Maps i innych produktach firmy, co potwierdza jej niezawodność i wydajność.
Kluczowa różnica Glide od analogów — automatyczne skalowanie obrazów do rozmiaru ImageView. Jeśli Picasso ładuje obraz w pełnej rozdzielczości, a następnie go skaluje, to Glide dekoduje plik od razu w potrzebnym rozmiarze. To zmniejsza szczytowe zużycie pamięci i przyspiesza wyświetlanie na listach z różnymi rozmiarami komórek.
Glide zapewnia szeroki zestaw funkcji do pracy z obrazami, obejmujący zarówno proste, jak i złożone scenariusze ładowania treści.
GIF i animowane WebP Glide ładuje i wyświetla tak samo prosto, jak statyczne obrazy. Biblioteka automatycznie określa format po typie MIME i dekoduje animację, wyświetlając klatki w tle. Do zarządzania odtwarzaniem dostępne są metody asGif i asBitmap.
Glide automatycznie wiąże się z cyklem życia Activity, Fragment i View. Przy pauzie Activity ładowanie jest wstrzymywane, przy zniszczeniu — anulowane. To zapobiega wyciekom pamięci i ładowaniu obrazów dla już zamkniętych ekranów. Integracja działa poprzez wsparcie LifecycleOwner.
Glide może wyodrębniać klatki z wideo po URL lub lokalnej ścieżce. W tym celu używana jest metoda asBitmap() w kombinacji z load() dla URI wideo. Glide automatycznie wybiera kluczową klatkę lub klatkę według określonego znacznika czasu. Jest to przydatne do wyświetlania podglądu wideo.
GlideApp — to wygenerowana klasa, która zapewnia rozszerzone API na podstawie konfiguracji AppGlideModule. Za jej pomocą można używać metod niedostępnych w standardowym Glide.with: ładowanie z niestandardowymi opcjami domyślnymi, integracja z bibliotekami i wstępnie ustawione transformacje. Do generowania wymagana jest adnotacja @GlideModule w klasie dziedziczącej po AppGlideModule.
Glide używa wielopoziomowej architektury z silnikiem, dekoderami, transformacjami i pamięcią podręczną. Każde zapytanie przechodzi przez łańcuch handlerów optymalizujących ładowanie pod konkretny ImageView.
Przy wywołaniu into(view) Glide sprawdza pamięć podręczną: aktywne zasoby, pamięć podręczną w pamięci RAM, pamięć dyskową i dopiero sieć. Obraz jest automatycznie skalowany do rozmiaru docelowego ImageView z uwzględnieniem gęstości ekranu i scaleType. To zmniejsza użycie pamięci — kluczowa zaleta Glide.
Glide.with(context)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.override(400, 300)
.centerCrop()
.into(imageView)
Instalacja Glide odbywa się przez Gradle. Biblioteka wymaga konfiguracji przez AppGlideModule do generowania API. Minimalna wersja Android API — 21.
W build.gradle dodaj Glide z kapt-handlerem adnotacji do generowania API GlideApp. Dla Kotlin użyj kapt zamiast annotationProcessor. Wersja Glide 4.16+ stabilnie współpracuje z Android Gradle Plugin 8.x.
dependencies {
implementation "com.github.bumptech.glide:glide:4.16.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.16.0"
}
// Dla Kotlin użyj kapt
// kapt "com.github.bumptech.glide:compiler:4.16.0"
AppGlideModule — obowiązkowy komponent do konfiguracji Glide. Pozwala ustawić rozmiar pamięci podręcznej, niestandardowy HttpStack i zarejestrować własne dekodery. Moduł jest skanowany przez Glide przy starcie aplikacji. Adnotacja @GlideModule rejestruje go automatycznie.
@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)
);
}
}
Przykłady poniżej demonstrują typowe scenariusze: ładowanie obrazu, praca z GIF i wyodrębnianie klatki wideo.
Podstawowe ładowanie przez Glide.with().load().into() — minimalny kod do wyświetlenia obrazu z sieci. Glide automatycznie dopasowuje rozmiar ImageView. Placeholder jest wyświetlany podczas ładowania, a error — przy błędzie.
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 ładowany jest tak samo jak statyczny obraz — Glide automatycznie określa format na podstawie typu treści. Do wymuszonego ładowania jako statyczny obraz użyj asBitmap(), dla GIF — asGif(). Glide efektywnie dekoduje tylko widoczne klatki.
Glide.with(context)
.asGif()
.load("https://example.com/animation.gif")
.into(imageView)
// Załaduj pierwszą klatkę GIF jako obraz statyczny
Glide.with(context)
.asBitmap()
.load("https://example.com/animation.gif")
.into(imageView)
Klatka wideo jest wyodrębniana przez Glide po URI lokalnego lub zdalnego wideo. Domyślnie Glide ładuje kluczową klatkę. Do określenia konkretnego znacznika czasu używany jest frameMillis. Jest to wygodne do wyświetlania podglądu w galerii wideo.
String videoUrl = "https://example.com/video.mp4";
Glide.with(context)
.asBitmap()
.load(videoUrl)
.override(200, 200)
.into(imageView)
Optymalizacja Glide dla RecyclerView — krytyczna umiejętność przy opracowywaniu aplikacji z dużą liczbą obrazów. Prawidłowa konfiguracja zapobiega opóźnieniom i błędom OOM.
Jedną z kluczowych możliwości Glide jest integracja z RecyclerView przez RecyclerViewPreloader. Ten komponent analizuje prędkość przewijania i kierunek ruchu, wstępnie ładując obrazy, które pojawią się na ekranie za kilka elementów. Do pracy z preloaderem należy zaimplementować interfejs PreloadSizeProvider i przekazać go do konstruktora wraz z docelowym ImageView.
Użycie metody override() z dokładnymi rozmiarami ImageView znacznie przyspiesza ładowanie. Gdy Glide zna dokładny rozmiar celu, może dekodować obraz od razu w potrzebnej rozdzielczości, pomijając etap skalowania. To skraca czas dekodowania i zmniejsza szczytowe zużycie pamięci o 30–40%.
Dla list z różnorodną treścią używaj różnych RequestOptions dla każdego typu elementów. Na przykład dla dużych obrazów-banerów można ustawić override(1200, 600) i jakość RGB_565, a dla awatarów — override(200, 200) i zaokrąglenie przez transform. Takie podejście pozwala optymalnie wykorzystać zasoby dla każdego typu treści.
Glide zapewnia elastyczne możliwości obsługi błędów poprzez obrazy error i niestandardowe RequestListener. RequestListener pozwala reagować na pomyślne ładowanie lub błąd, logować awarie lub wysyłać analitykę. Można również skonfigurować fallback — obraz wyświetlany, gdy load() otrzymał null zamiast linku.
Używaj RecyclerViewPreloader do wstępnego ładowania obrazów, zanim użytkownik do nich przewinie. Glide obsługuje integrację z RecyclerView poprzez preloader, który analizuje prędkość przewijania i ładuje obrazy z wyprzedzeniem.
Thumbnail multiplikacja pozwala najpierw pokazać pomniejszoną wersję obrazu, a następnie załadować pełną. Wywołanie thumbnail(0.25f) ładuje wersję 25% rozmiaru, która wyświetla się natychmiast, a pełnowymiarowy obraz ładuje się później. To stwarza wrażenie błyskawicznego ładowania.
Dla list-adapterów używaj .override() z dokładnymi rozmiarami ImageView, aby Glide nie skalował obrazu za każdym razem. To zmniejsza obciążenie CPU i zużycie pamięci. Rozmiar pamięci podręcznej dobiera się eksperymentalnie, ale 250 MB dla dysku i 20% dostępnej pamięci — dobry punkt wyjścia.
Często zadawane pytania
Glide obsługuje GIF, klatki wideo i animowane WebP. Jest bardziej efektywny w zarządzaniu pamięcią i rekomendowany przez Google. Picasso jest mniejszy i prostszy w użyciu. Do złożonych projektów wybieraj Glide.
Glide przyjmuje LifecycleOwner (Fragment, Activity) lub View. Biblioteka automatycznie śledzi stan przez LifecycleObserver: wstrzymuje ładowanie przy pauzie i anuluje przy zniszczeniu, zapobiegając wyciekom.
Tak, użyj asBitmap() przed load(). Glide załaduje GIF jako statyczny obraz i pokaże tylko pierwszą klatkę. Jest to przydatne dla list, gdzie animacja GIF jest niepożądana ze względu na wydajność.
Pamięć podręczna Glide składa się z trzech poziomów: aktywne zasoby (aktualnie używane), pamięć RAM (LRU-cache) i dysk (LruCache). Obrazy załadowane z pamięci podręcznej wyświetlają się natychmiast. Pamięć podręczna jest automatycznie czyszczona przy braku pamięci.
Niestandardowy klient HTTP rejestruje się przez OkHttpUrlLoader w AppGlideModule. Nadpisz registerComponents i zarejestruj własny OkHttpClient. Pozwala to dodać przechwytywacze, certyfikaty i niestandardowe limity czasu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również