Picasso to biblioteka do ładowania obrazów w aplikacjach Android, stworzona przez firmę Square. Biblioteka oferuje prosty i wyrazisty API do ładowania, buforowania i wyświetlania grafiki z sieci. Według danych statystyk GitHub Picasso, biblioteka została pobrana ponad 100 000 razy. Picasso automatycznie zarządza pamięcią i buforuje obrazy na kilku poziomach.
Najważniejsze
Picasso to biblioteka do asynchronicznego ładowania obrazów w Androidzie, stworzona przez firmę Square. Nazwa pochodzi od artysty Pabla Picassa, odzwierciedlając filozofię biblioteki: zamieniać skomplikowane zadanie w prosty i elegancki API. Jest to najpopularniejsza biblioteka do ładowania obrazów w społeczności Android.
Architektura Picasso jest minimalistyczna: biblioteka używa puli wątków do ładowania, LruCache do bufora w pamięci i DiskLruCache do bufora dyskowego. W przeciwieństwie do Glide, Picasso nie wymaga konfiguracji AppGlideModule i jest gotowy do użycia zaraz po dodaniu zależności. To czyni go idealnym wyborem dla prototypów i małych projektów.
Picasso 2.8 — ostatnia stabilna wersja, kompatybilna z Android API 21+ i Java 8+. Biblioteka nie wymaga konfiguracji wtyczek Gradle ani adnotacji, co upraszcza migrację między wersjami i zmniejsza ryzyko błędów podczas aktualizacji. Mimo długiej historii, Picasso pozostaje popularny w tysiącach projektów na całym świecie.
Głównym zadaniem Picasso jest załadowanie obrazu z URL, zdekodowanie go, zmiana rozmiaru w razie potrzeby i wyświetlenie w ImageView. Biblioteka automatycznie zarządza wątkami tła, buforem i ponownym użyciem ImageView na listach.
Od momentu premiery w 2013 roku Picasso stał się standardem ładowania obrazów w społeczności Android. Biblioteka jest używana w tysiącach aplikacji dzięki minimalnemu progowi wejścia — do pierwszego użycia wystarczy jedna linia kodu.
Priorytety w Picasso pozwalają zarządzać kolejnością ładowania obrazów. Domyślnie wszystkie żądania mają normalny priorytet, ale dla krytycznych obrazów można ustawić wysoki priorytet przez metodę priority. Jeśli ImageView jest ponownie używane (np. w RecyclerView), Picasso automatycznie anuluje poprzednie żądanie i uruchamia nowe, zapobiegając migotaniu obrazów podczas przewijania.
Picasso oferuje zestaw funkcji, które pokrywają podstawowe scenariusze pracy z obrazami w aplikacjach mobilnych bez zbędnej złożoności.
Bufor Picasso składa się z dwóch poziomów: pamięć operacyjna dla szybkiego dostępu i dysk dla stałego przechowywania. Przy żądaniu obrazu biblioteka najpierw sprawdza bufor w pamięci, następnie dysk, a dopiero potem wykonuje żądanie sieciowe. To znacznie przyspiesza wyświetlanie wielokrotnie ładowanych obrazów.
Transformacje pozwalają zmienić rozmiar, przyciąć lub obrócić obraz bez dekodowania oryginału za każdym razem. Picasso udostępnia wbudowane transformacje CenterCrop i CenterInside, a także pozwala tworzyć własne przez interfejs Transformation. Przetworzone obrazy są buforowane osobno.
Placeholder jest wyświetlany podczas ładowania obrazu z sieci, dając użytkownikowi wizualną informację zwrotną. Obraz błędu jest pokazywany przy niepowodzeniu ładowania. Picasso obsługuje również obraz, który jest wyświetlany, dopóki nie zostanie załadowana nowa wersja, co jest przydatne dla aktualizowanych awatarów.
Picasso obsługuje ładowanie obrazów z URL, zasobów, plików, dostawców treści i URI. Metoda load() jest przeciążona dla wszystkich tych typów, a biblioteka automatycznie określa źródło. Dla zasobów i plików Picasso nie wykonuje żądania sieciowego, tylko ładuje dane bezpośrednio, co przyspiesza wyświetlanie wbudowanej grafiki.
Picasso używa architektury opartej na RequestCreator i Dispatcher. Każde żądanie jest tworzone przez Picasso.get().load() i wykonywane w puli wątków. Dispatcher zarządza kolejką żądań, priorytetami i anulowaniem żądań przy ponownym użyciu ImageView.
Przy wywołaniu into(view) Picasso tworzy obiekt Action, który zawiera URL, transformacje, target i callback. Action jest umieszczany w kolejce Dispatcher. Silnik ładuje obraz przez Downloader (domyślnie OkHttp), dekoduje Bitmap, stosuje transformacje i zwraca wynik do wątku UI. Wszystkie obrazy są automatycznie dopasowywane do rozmiaru ImageView.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
Instalacja Picasso odbywa się przez Gradle. Biblioteka jest rozpowszechniana przez Maven Central i nie wymaga skomplikowanej konfiguracji. Minimalna wersja Android API to 21.
Do pliku build.gradle na poziomie modułu dodaj implementation 'com.squareup.picasso:picasso:2.8'. Po synchronizacji Gradle Picasso jest gotowy do użycia. Do pracy z siecią Picasso automatycznie używa OkHttp, jeśli jest w projekcie, lub wbudowanego HttpURLConnection.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka do ładowania z OkHttp (opcjonalnie)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
Wskaźnik debugowania Picasso pokazuje kolorowy trójkąt w rogu każdego obrazu: czerwony dla ładowania sieciowego, niebieski dla bufora dyskowego, zielony dla bufora w pamięci. Włącza się go przez wywołanie setIndicatorsEnabled(true) na instancji Picasso. Domyślny bufor wynosi 15% dostępnej pamięci urządzenia.
Do konfiguracji własnej instancji Picasso użyj Picasso.Builder. Pozwala on ustawić Executor dla wątków tła, Downloader dla żądań sieciowych, MemoryCache i DiskCache. Własna instancja jest szczególnie przydatna w testach, gdzie można zastąpić Downloader atrapą zwracającą obraz bez żądania sieciowego.
Przykłady poniżej przedstawiają typowe scenariusze pracy z Picasso: ładowanie prostego obrazu, używanie transformacji i ładowanie w RecyclerView.
Podstawowe ładowanie do ImageView wykonuje się jednym wywołaniem. Picasso automatycznie dopasowuje obraz do rozmiarów widoku z uwzględnieniem scaleType. Placeholder jest wyświetlany do zakończenia ładowania, a error — przy wystąpieniu błędu połączenia.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
Transformacja BlurTransformation rozmywa obraz z zadanym promieniem. Własne transformacje implementują interfejs Transformation z metodą transform. Bufor zapisuje wynik transformacji pod unikalnym kluczem, aby nie stosować jej ponownie.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// zastosowanie rozmycia
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
W RecyclerView Picasso automatycznie anuluje żądania dla ImageView, które opuściły ekran, i ponownie wykorzystuje już załadowane obrazy. Zapobiega to wyciekom pamięci i zapewnia płynne przewijanie.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
Porównanie Picasso i Glide to częste pytanie przy wyborze biblioteki do ładowania obrazów w Androidzie. Obie biblioteki rozwiązują to samo zadanie, ale mają różne priorytety i cechy użycia.
Picasso lepiej nadaje się do projektów, w których ważna jest prostota i minimalny rozmiar APK. Glide wybiera się, gdy potrzebna jest obsługa GIF, klatek wideo i maksymalna optymalizacja pamięci. Glide automatycznie skaluje obraz do dokładnego rozmiaru ImageView, co zmniejsza zużycie pamięci nawet o 50% w porównaniu z Picasso w niektórych scenariuszach.
Według testów wydajności Glide pokazuje lepsze wyniki przy pracy z RecyclerView dzięki mechanizmowi wstępnego ładowania i automatycznemu anulowaniu żądań przy szybkim przewijaniu. Picasso stosuje prostszą strategię, co czyni go przewidywalnym, ale mniej wydajnym przy dużych ilościach danych.
Picasso skupia się na prostocie API i minimalnym rozmiarze. Glide oferuje szerszą funkcjonalność: obsługę GIF, animowanych obrazów, klatek wideo i integrację z cyklem życia. Glide również efektywniej zarządza pamięcią dzięki automatycznemu skalowaniu do rozmiaru ImageView.
| Kryterium | Picasso | Glide |
|---|---|---|
| Rozmiar biblioteki | ~120 KB | ~500 KB |
| Obsługa GIF | Nie | Tak |
| Klatki wideo | Nie | Tak |
| Twórca | Square | Google (Bumptech) |
| API | Łańcuch Fluent | RequestBuilder |
Według danych Android Developer Relations, Glide jest zalecany przez Google jako preferowana biblioteka do ładowania obrazów w nowych projektach. Picasso pozostaje doskonałym wyborem dla prostych projektów, w których nie są potrzebne GIF i klatki wideo.
Często zadawane pytania
Picasso jest mniejszy i prostszy w użyciu. Glide obsługuje GIF i klatki wideo, efektywniej zarządza pamięcią i jest zalecany przez Google. Wybór zależy od potrzeb projektu w zakresie dodatkowych formatów.
Do czyszczenia bufora Picasso użyj metody Picasso.get().invalidate(url) dla pojedynczego obrazu lub shutdown() do całkowitego czyszczenia. Bufor dyskowy jest usuwany przy ponownej instalacji aplikacji lub przez ustawienia systemowe.
Picasso nie zależy od obrotu ekranu. Załadowane obrazy są przechowywane w buforze i wyświetlane z niego przy odtworzeniu Activity. Aby przyspieszyć działanie, użyj ViewModel w połączeniu z Picasso do przechowywania załadowanych danych.
Tak, Picasso jest w pełni kompatybilny z Kotlin. Programiści Kotlin mogą używać funkcji rozszerzających dla bardziej zwięzłej składni lub stosować bibliotekę koptional do obsługi wartości null przy ładowaniu obrazów.
Picasso używa LruCache do bufora w pamięci, automatycznie usuwając nieużywane obrazy. Domyślny rozmiar bufora to 15% dostępnej pamięci aplikacji. Przy braku pamięci Picasso zwalnia zasoby przez onTrimMemory.
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ż