Picasso è una libreria per il caricamento di immagini in applicazioni Android, sviluppata da Square. La libreria fornisce un’API semplice ed espressiva per caricare, memorizzare nella cache e visualizzare grafica dalla rete. Secondo le statistiche GitHub di Picasso, la libreria è stata scaricata più di 100.000 volte. Picasso gestisce automaticamente la memoria e memorizza nella cache le immagini su più livelli.
Punti chiave
Picasso è una libreria per il caricamento asincrono di immagini in Android, creata da Square. Prende il nome dall’artista Pablo Picasso, riflettendo la filosofia della libreria: trasformare un compito complesso in un’API semplice ed elegante. È la libreria più popolare per il caricamento di immagini nella comunità Android.
L’architettura di Picasso è minimalista: la libreria utilizza un pool di thread per il caricamento, LruCache per la cache in memoria e DiskLruCache per la cache su disco. A differenza di Glide, Picasso non richiede configurazione di AppGlideModule ed è pronto all’uso immediatamente dopo l’aggiunta della dipendenza. Questo lo rende una scelta ideale per prototipi e progetti piccoli.
Picasso 2.8 è l’ultima versione stabile, compatibile con Android API 21+ e Java 8+. La libreria non richiede configurazione di plugin Gradle o annotazioni, semplificando la migrazione tra versioni e riducendo la probabilità di errori durante gli aggiornamenti. Nonostante la sua lunga storia, Picasso rimane richiesto in migliaia di progetti in tutto il mondo.
Il compito principale di Picasso è caricare un’immagine tramite URL, decodificarla, ridimensionarla se necessario e visualizzarla in un ImageView. La libreria gestisce automaticamente i thread in background, la cache e il riutilizzo di ImageView nelle liste.
Dal suo rilascio nel 2013, Picasso è diventato lo standard per il caricamento di immagini nella comunità Android. La libreria è utilizzata in migliaia di applicazioni grazie alla sua soglia d’ingresso minima — basta una sola riga di codice per il primo utilizzo.
Le priorità in Picasso consentono di gestire l’ordine di caricamento delle immagini. Per impostazione predefinita, tutte le richieste hanno priorità normale, ma per le immagini critiche è possibile impostare una priorità alta tramite il metodo priority. Se un ImageView viene riutilizzato (ad esempio, in RecyclerView), Picasso cancella automaticamente la richiesta precedente e ne avvia una nuova, prevenendo lo sfarfallio delle immagini durante lo scorrimento.
Picasso offre un insieme di funzionalità che coprono i principali scenari di lavoro con le immagini in applicazioni mobili senza complessità superflue.
La cache di Picasso è composta da due livelli: RAM per l’accesso rapido e disco per l’archiviazione permanente. Quando si richiede un’immagine, la libreria controlla prima la cache in memoria, poi il disco e solo successivamente effettua una richiesta di rete. Questo accelera significativamente la visualizzazione di immagini caricate ripetutamente.
Le trasformazioni consentono di ridimensionare, ritagliare o ruotare un’immagine senza decodificare ogni volta l’originale. Picasso fornisce le trasformazioni integrate CenterCrop e CenterInside e permette anche di crearne di personalizzate tramite l’interfaccia Transformation. Le immagini trasformate vengono memorizzate nella cache separatamente.
Il placeholder viene visualizzato durante il caricamento dell’immagine dalla rete, fornendo un feedback visivo all’utente. Un’immagine di errore viene mostrata in caso di fallimento del caricamento. Picasso supporta anche un’immagine che viene visualizzata fino al caricamento di una nuova versione, utile per avatar aggiornabili.
Picasso supporta il caricamento di immagini da URL, risorse, file, content provider e URI. Il metodo load() è sovraccaricato per tutti questi tipi e la libreria determina automaticamente la fonte. Per risorse e file, Picasso non effettua una richiesta di rete ma carica i dati direttamente, accelerando la visualizzazione della grafica integrata.
Picasso utilizza un’architettura basata su RequestCreator e Dispatcher. Ogni richiesta viene creata tramite Picasso.get().load() ed eseguita in un pool di thread. Il Dispatcher gestisce la coda delle richieste, le priorità e la cancellazione quando un ImageView viene riutilizzato.
Quando si chiama into(view), Picasso crea un oggetto Action contenente URL, trasformazioni, destinazione e callback. L’Action viene inserita nella coda del Dispatcher. Il motore carica l’immagine tramite Downloader (OkHttp per impostazione predefinita), decodifica il Bitmap, applica le trasformazioni e consegna il risultato al thread UI. Tutte le immagini vengono automaticamente adattate alle dimensioni dell’ImageView.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
L’installazione di Picasso avviene tramite Gradle. La libreria è distribuita tramite Maven Central e non richiede configurazioni complesse. La versione minima dell’API Android è 21.
Nel file build.gradle a livello di modulo, aggiungi implementation ‘com.squareup.picasso:picasso:2.8’. Dopo la sincronizzazione di Gradle, Picasso è pronto all’uso. Per le operazioni di rete, Picasso utilizza automaticamente OkHttp se presente nel progetto, o la HttpURLConnection integrata.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka per il caricamento da OkHttp (opzionale)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
L’indicatore di debug di Picasso mostra un triangolo colorato nell’angolo di ogni immagine: rosso per il caricamento dalla rete, blu per la cache su disco, verde per la cache in memoria. Si attiva chiamando setIndicatorsEnabled(true) sull’istanza di Picasso. La dimensione predefinita della cache è il 15% della memoria disponibile del dispositivo.
Per configurare un’istanza personalizzata di Picasso, usa Picasso.Builder. Consente di impostare un Executor per i thread in background, un Downloader per le richieste di rete, MemoryCache e DiskCache. Un’istanza personalizzata è particolarmente utile nei test, dove è possibile sostituire il Downloader con uno stub che restituisce un’immagine senza richiesta di rete.
Gli esempi seguenti illustrano scenari tipici di lavoro con Picasso: caricamento di un’immagine semplice, utilizzo di trasformazioni e caricamento in RecyclerView.
Il caricamento di base in un ImageView avviene con una singola chiamata. Picasso adatta automaticamente l’immagine alle dimensioni della vista tenendo conto di scaleType. Un placeholder viene mostrato fino al completamento del caricamento, mentre un’immagine di errore viene visualizzata in caso di errore di connessione.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
BlurTransformation sfoca l’immagine con un raggio specificato. Le trasformazioni personalizzate implementano l’interfaccia Transformation con il metodo transform. La cache memorizza il risultato della trasformazione sotto una chiave univoca per evitare di riapplicarla.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// applicazione della sfocatura
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
In RecyclerView, Picasso cancella automaticamente le richieste per gli ImageView che sono usciti dallo schermo e riutilizza le immagini già caricate. Questo previene perdite di memoria e garantisce uno scorrimento fluido.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
Il confronto tra Picasso e Glide è una domanda comune nella scelta di una libreria di caricamento immagini per Android. Entrambe le librerie risolvono lo stesso compito ma hanno priorità e caratteristiche d’uso diverse.
Picasso è più adatto per progetti in cui semplicità e dimensioni minime dell’APK sono importanti. Glide viene scelto quando sono necessari supporto GIF, fotogrammi video e massima ottimizzazione della memoria. Glide ridimensiona automaticamente l’immagine alla dimensione esatta dell’ImageView, riducendo il consumo di memoria fino al 50% rispetto a Picasso in alcuni scenari.
Nei test di performance, Glide mostra risultati migliori quando lavora con RecyclerView grazie al meccanismo di precaricamento e alla cancellazione automatica delle richieste durante lo scorrimento veloce. Picasso utilizza una strategia più semplice, che lo rende prevedibile ma meno efficiente su grandi volumi di dati.
Picasso si concentra sulla semplicità dell’API e sulle dimensioni minime. Glide offre funzionalità più ampie: supporto per GIF, immagini animate, fotogrammi video e integrazione con il ciclo di vita. Glide gestisce anche la memoria in modo più efficiente grazie al ridimensionamento automatico alle dimensioni dell’ImageView.
| Criterio | Picasso | Glide |
|---|---|---|
| Dimensione libreria | ~120 KB | ~500 KB |
| Supporto GIF | No | Sì |
| Fotogrammi video | No | Sì |
| Sviluppatore | Square | Google (Bumptech) |
| API | Catena fluida | RequestBuilder |
Secondo Android Developer Relations, Google raccomanda Glide come libreria preferita per il caricamento di immagini nei nuovi progetti. Picasso rimane un’ottima scelta per progetti semplici dove GIF e fotogrammi video non sono necessari.
Domande frequenti
Picasso è più piccolo e più facile da usare. Glide supporta GIF e fotogrammi video, gestisce la memoria in modo più efficiente ed è raccomandato da Google. La scelta dipende dalle esigenze del progetto per formati aggiuntivi.
Per svuotare la cache di Picasso, usa il metodo Picasso.get().invalidate(url) per una singola immagine o shutdown() per una pulizia completa. La cache su disco viene eliminata quando si reinstallano l’app o tramite le impostazioni di sistema.
Picasso non dipende dalla rotazione dello schermo. Le immagini caricate vengono conservate nella cache e visualizzate da essa quando l’Activity viene ricreata. Per accelerare, usa ViewModel insieme a Picasso per preservare i dati caricati.
Sì, Picasso è completamente compatibile con Kotlin. Gli sviluppatori Kotlin possono utilizzare funzioni di estensione per una sintassi più concisa o applicare la libreria koptional per gestire i valori null durante il caricamento delle immagini.
Picasso utilizza LruCache per la cache in memoria, ripulendo automaticamente le immagini inutilizzate. La dimensione predefinita della cache è il 15% della memoria disponibile dell’app. Quando la memoria è scarsa, Picasso libera risorse tramite onTrimMemory.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche