Picasso este o bibliotecă pentru încărcarea imaginilor în aplicații Android, dezvoltată de compania Square. Biblioteca oferă un API simplu și expresiv pentru încărcarea, stocarea în cache și afișarea graficii din rețea. Conform statisticilor GitHub Picasso, biblioteca a fost descărcată de peste 100.000 de ori. Picasso gestionează automat memoria și stochează imaginile în cache la mai multe niveluri.
Principalele puncte
Picasso este o bibliotecă pentru încărcarea asincronă a imaginilor în Android, creată de compania Square. Numele provine de la artistul Pablo Picasso, reflectând filosofia bibliotecii: transformarea unei sarcini complexe într-un API simplu și elegant. Este cea mai populară bibliotecă pentru încărcarea imaginilor în comunitatea Android.
Arhitectura Picasso este minimalistă: biblioteca utilizează un pool de fire pentru încărcare, LruCache pentru cache în memorie și DiskLruCache pentru cache pe disc. Spre deosebire de Glide, Picasso nu necesită configurarea AppGlideModule și este gata de utilizare imediat după adăugarea dependenței. Acest lucru îl face alegerea ideală pentru prototipuri și proiecte mici.
Picasso 2.8 — ultima versiune stabilă, compatibilă cu Android API 21+ și Java 8+. Biblioteca nu necesită configurarea pluginurilor Gradle sau adnotărilor, ceea ce simplifică migrarea între versiuni și reduce riscul de erori la actualizare. În ciuda istoriei îndelungate, Picasso rămâne solicitat în mii de proiecte din întreaga lume.
Sarcina principală a Picasso este să încarce o imagine de pe URL, să o decodeze, să-i modifice dimensiunea dacă este necesar și să o afișeze în ImageView. Biblioteca gestionează automat firele de fundal, cache-ul și reutilizarea ImageView în liste.
De la lansarea din 2013, Picasso a devenit standardul pentru încărcarea imaginilor în comunitatea Android. Biblioteca este utilizată în mii de aplicații datorită pragului minim de intrare — pentru prima utilizare este suficientă o singură linie de cod.
Prioritățile în Picasso permit gestionarea ordinii de încărcare a imaginilor. În mod implicit, toate cererile au prioritate normală, dar pentru imaginile critice se poate seta prioritate ridicată prin metoda priority. Dacă ImageView este reutilizat (de exemplu, în RecyclerView), Picasso anulează automat cererea anterioară și pornește una nouă, prevenind pâlpâirea imaginilor la derulare.
Picasso oferă un set de funcții care acoperă scenariile de bază de lucru cu imagini în aplicațiile mobile, fără complexitate inutilă.
Cache-ul Picasso constă din două niveluri: memoria RAM pentru acces rapid și discul pentru stocare permanentă. La solicitarea unei imagini, biblioteca verifică mai întâi cache-ul din memorie, apoi discul și abia apoi execută cererea de rețea. Acest lucru accelerează semnificativ afișarea imaginilor încărcate repetat.
Transformările permit redimensionarea, decuparea sau rotirea imaginii fără a decoda originalul de fiecare dată. Picasso oferă transformări încorporate CenterCrop și CenterInside, precum și posibilitatea de a crea transformări personalizate prin interfața Transformation. Imaginile transformate sunt stocate în cache separat.
Placeholder este afișat în timpul încărcării imaginii din rețea, oferind utilizatorului un feedback vizual. Imaginea de eroare este afișată la eșecul încărcării. Picasso suportă și o imagine care este afișată până când o nouă versiune este încărcată, utilă pentru avatarurile actualizabile.
Picasso suportă încărcarea imaginilor din URL, resurse, fișiere, furnizori de conținut și URI. Metoda load() este supraîncărcată pentru toate aceste tipuri, iar biblioteca determină automat sursa. Pentru resurse și fișiere, Picasso nu execută o cerere de rețea, ci încarcă datele direct, accelerând afișarea graficii încorporate.
Picasso utilizează o arhitectură bazată pe RequestCreator și Dispatcher. Fiecare cerere este creată prin Picasso.get().load() și executată într-un pool de fire. Dispatcher gestionează coada de cereri, prioritățile și anularea cererilor la reutilizarea ImageView.
La apelarea into(view), Picasso creează un obiect Action care conține URL, transformări, target și callback. Action este plasat în coada Dispatcher. Motorul încarcă imaginea prin Downloader (OkHttp implicit), decodează Bitmap, aplică transformările și returnează rezultatul în firul UI. Toate imaginile sunt ajustate automat la dimensiunea ImageView.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
Instalarea Picasso se face prin Gradle. Biblioteca este distribuită prin Maven Central și nu necesită o configurare complexă. Versiunea minimă Android API este 21.
În fișierul build.gradle la nivel de modul, adăugați implementation 'com.squareup.picasso:picasso:2.8'. După sincronizarea Gradle, Picasso este gata de utilizare. Pentru lucrul cu rețeaua, Picasso utilizează automat OkHttp dacă este prezent în proiect sau HttpURLConnection încorporat.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka pentru încărcare din OkHttp (opțional)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
Indicatorul de depanare Picasso afișează un triunghi colorat în colțul fiecărei imagini: roșu pentru încărcare din rețea, albastru pentru cache pe disc, verde pentru cache în memorie. Se activează prin apelarea setIndicatorsEnabled(true) pe instanța Picasso. Cache-ul implicit este de 15% din memoria disponibilă a dispozitivului.
Pentru configurarea unei instanțe personalizate Picasso, utilizați Picasso.Builder. Acesta permite setarea Executor pentru firele de fundal, Downloader pentru cererile de rețea, MemoryCache și DiskCache. O instanță personalizată este utilă în special în teste, unde Downloader poate fi înlocuit cu un stub care returnează o imagine fără cerere de rețea.
Exemplele de mai jos demonstrează scenarii tipice de lucru cu Picasso: încărcarea unei imagini simple, utilizarea transformărilor și încărcarea în RecyclerView.
Încărcarea de bază în ImageView se realizează printr-un singur apel. Picasso ajustează automat imaginea la dimensiunile view-ului ținând cont de scaleType. Placeholder este afișat până la finalizarea încărcării, iar error — la apariția unei erori de conexiune.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
Transformarea BlurTransformation estompează imaginea cu o rază dată. Transformările personalizate implementează interfața Transformation cu metoda transform. Cache-ul salvează rezultatul transformării sub o cheie unică pentru a nu o aplica din nou.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// aplicarea estompării
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
În RecyclerView, Picasso anulează automat cererile pentru ImageView-urile care au ieșit din ecran și reutilizează imaginile deja încărcate. Acest lucru previne scurgerile de memorie și asigură o derulare lină.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
Compararea Picasso și Glide este o întrebare frecventă la alegerea unei biblioteci de încărcare a imaginilor pentru Android. Ambele biblioteci rezolvă aceeași sarcină, dar au priorități și caracteristici diferite.
Picasso este mai potrivit pentru proiecte unde contează simplitatea și dimensiunea minimă a APK-ului. Glide este ales când este necesar suport pentru GIF, cadre video și optimizarea maximă a memoriei. Glide scalează automat imaginea la dimensiunea exactă a ImageView, reducând consumul de memorie cu până la 50% față de Picasso în unele scenarii.
Conform testelor de performanță, Glide arată rezultate mai bune la lucrul cu RecyclerView datorită mecanismului de preîncărcare și anulării automate a cererilor la derularea rapidă. Picasso utilizează o strategie mai simplă, ceea ce îl face previzibil, dar mai puțin eficient la volume mari de date.
Picasso se concentrează pe simplitatea API-ului și dimensiunea minimă. Glide oferă o funcționalitate mai largă: suport pentru GIF, imagini animate, cadre video și integrare cu ciclul de viață. Glide gestionează și memoria mai eficient datorită scalării automate la dimensiunea ImageView.
| Criteriu | Picasso | Glide |
|---|---|---|
| Dimensiunea bibliotecii | ~120 KB | ~500 KB |
| Suport GIF | Nu | Da |
| Cadre video | Nu | Da |
| Dezvoltator | Square | Google (Bumptech) |
| API | Lanț Fluent | RequestBuilder |
Conform Android Developer Relations, Glide este recomandat de Google ca bibliotecă preferată pentru încărcarea imaginilor în proiecte noi. Picasso rămâne o alegere excelentă pentru proiecte simple unde nu sunt necesare GIF și cadre video.
Întrebări frecvente
Picasso este mai mic și mai simplu de utilizat. Glide suportă GIF și cadre video, gestionează mai eficient memoria și este recomandat de Google. Alegerea depinde de necesitățile proiectului în formate suplimentare.
Pentru curățarea cache-ului Picasso utilizați metoda Picasso.get().invalidate(url) pentru o singură imagine sau shutdown() pentru curățarea completă. Cache-ul pe disc se șterge la reinstalarea aplicației sau prin setările de sistem.
Picasso nu depinde de rotirea ecranului. Imaginile încărcate sunt păstrate în cache și afișate din acesta la recrearea Activity. Pentru accelerare, utilizați ViewModel împreună cu Picasso pentru păstrarea datelor încărcate.
Da, Picasso este complet compatibil cu Kotlin. Dezvoltatorii Kotlin pot utiliza funcții de extensie pentru o sintaxă mai concisă sau pot aplica biblioteca koptional pentru gestionarea valorilor null la încărcarea imaginilor.
Picasso utilizează LruCache pentru cache în memorie, ștergând automat imaginile neutilizate. Dimensiunea implicită a cache-ului este de 15% din memoria disponibilă a aplicației. La insuficiența memoriei, Picasso eliberează resurse prin onTrimMemory.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și