Glide jest wydajną biblioteką służącą do zarządzania multimediami, ich dekodowaniem i buforowaniem w pamięci oraz na dysku w celu ponownego szybkiego użycia. Skupia się przede wszystkim na płynnym i wydajnym wyświetlaniu, pobieraniu i modyfikowaniu obrazów. Ponadto obsługuje także obrazy animowane GIF oraz wideo. Zawiera elastyczne i prosty interfejs API, który umożliwia podłączanie niemal dowolnego klienta sieciowego (domyślnie jest to HttpUrlConnection).
Ładowanie
Pobieranie i ładowanie obrazów jest proste i może ograniczyć się zaledwie do jednego ciągu instrukcji. Wyrażenie with zwraca obiekt typu RequestBuilder na którym należy wskazać źródło (load) i typ zasobu, miejsce docelowe (into) oraz opcjonalnie dokonać konfiguracji żądania. Możliwe jest także pobranie zasobu do wskazanego typu obietku z pominięciem ładowania do kontrolki widoku przez wskazanie jako miejsca docelowego obiektu typu Target. Glide automatycznie wylicza rozmiar obrazu, aby dopasować go do widoku w którym będzie wyświetlany, jednakże jawnie ustawiony rozmiar przyspiesza proces przetwarzania. W trakcie niszczenia komponentu powiązane z nim zasoby są poddawane recyklingowi, a te nieużywany zostają usuwane.
Symbol zastępczy
Symbol zastępczy (placeholder) jest graficznym wyświetlanym w trakcie pobierania i przetwarzania obiektu źródłowego. Gdy żądanie zostaje ukończone pozytywnie wówczas placeholder jest zastępowany przez źródło. Ładowanie odbywa się na wątku głównym, a transformacje są niedozwolone. Dodatkowo możliwe jest ustawienie obiektu placeholder dla żądania zakończonego kodem błędu (error i fallback), jednakże gdy nie zostanie on ustawiony wówczas pozostanie wyświetlany bieżący placeholder (jeśli został ustawiony). Ponadto możliwe jest ustawienie miniatury (thumbnail), która jest pobierana równolegle z głównym żądaniem co pozwala na zwiększenie doświadczeń użytkownika przez wyświetlenia obrazu niższej rozdzielczości (zamiast zastępnika) w trakcie oczekiwania na pobranie pełnego obrazu.
Opcje
Glide oferuje wiele opcji przetwarzania i ładowania zasobów takich jak m.in. transformacje, przejścia, czy buforowanie które można zastosować dla wybranych żądań bezpośrednio na obiekcie RequestBuilder. Opcje mogą być także współdzielone przez instancję RequestOptions (transformacje i strategie buforowania) oraz TransitionOptions (przejścia). Transformacje (transitions) zwracają zmodyfikowany zasób i są używane przede wszystkim do przycinania obrazu i stosowania filtrów. Zastosowanie metody dowolnej transformacji zastępuje poprzednią dlatego w celu zaaplikowania kilku transformacji należy przekazać je do metody transform. Przejścia (transformations) działa w kontekście pojedynczego żądania i pozwalają zdefiniować w jaki sposób Glide powinien przejść z obiektu zastępczego czy miniatury do załadowanego docelowego obrazu. Ponadto użycie przejść wpływa na wydajność w związku z czym należy rozważyć unikanie animacji przejść szczególnie w przypadku kolekcji.
Pamięć
Zanim Glide rozpocznie pobieranie nowego zasobu dokonuje sprawdzenia warstw pamięci w celu jego odnalezienia i ponownego użycia co przebiega w następujących krokach:
1. Aktywne zasoby (obraz jest wyświetlany w innym widoku) 2. Pamięc podręczna (obraz został niedawno załadowany i pozostaje nadal w pamięci) 3. Zasób (obraz został wcześniej zdekodowany, przekształcony i zapisany w pamięci dysku) 4. Dane (dane z których uzyskano obraz zapisano wcześniej w pamięci podręcznej dysku)
Jeśli zasób nie został odnaleziony w żadnej warstwie pamięci wówczas zostaje on pobrany z oryginalnego źródła. Weryfikacja istnienia zasobu w warstwach pamięci odbywa się na podstawie wyszukiwania klucza składającego się z modelu (File, Uri, Url itp.), opcjonalnej sygnatury dołączonej metodą signature oraz parametrów zasobów takich jak m.in. wielkość, transformacje, opcje czy typ (dla kroków 1-3). Glide pozwala na uwzględnienie (onlyRetrieveFromCache) lub pominięcie pamięci podręcznej (skipMemoryCache) oraz dostarcza kilka strategii dla pamięci dysku (DiskCacheStrategy), które umożliwiają wybór sposobu ładowania i zapisywania pobranych zasobów.
Wielkość pamięci jest automatycznie ustalana i może być modyfikowana w oparciu o klasę MemorySizeCalculator. Tymczasowe zwiększenie pamięci podręcznej odbywa się za pomocą metody setMemoryCategory, a ręczne czyszczenie pamięci podręcznej i dysku przy użyciu clearMemory (na głównym wątku) oraz clearDiskCache (na wątku pobocznym).
Interfejs API
Glide pozwala na rozszerzenie interfejsu API dzięki czemu możliwe jest ustawienie i nadpisanie domyślnych opcji globalnych dla żądań oraz dołączenie bibliotek integracyjnych. Aby wygenerować interfejs należy stworzyć klasę modułu AppGlideModule opatrzoną adnotacją @GlideModule oraz opcjonalnie klasę rozszerzeń @GlideExtension z metodami statycznymi oznaczonymi jako @GlideOption i @GlideType.
Odwołanie do stworzonego modułu odbywa się domyślnie na instancji GlideApp tworzonej przy budowaniu projektu. Nie wyklucza to jednak użycia w standardowy sposób za pomocą instancji Glide.
RecyclerView
Glide ułatwia współpracę z RecyclerView (obrazy są ładowane wcześniej zgodnie z kierunkiem przesuwania) poprzez użycie RecyclerViewPreloader jako obiektu słuchacza dla akcji przesuwania addOnScrollListener. W połączeniu z odpowiednim rozmiarem obrazu i optymalną strategią pamięci pozwala na zmniejszenie liczby ładowanych obrazów dostarczając je wcześniej.