Soluzione di memorizzazione nella cache delle immagini locale per Android: Square Picasso, Universal Image Loader, Glide, Fresco?


89

Sto cercando una libreria di caricamento e memorizzazione nella cache di immagini asincrone in Android. Stavo per usare Picasso, ma ho scoperto che Universal Image Loader è più popolare su GitHub. Qualcuno sa di queste due biblioteche? Un riepilogo dei pro e dei contro sarebbe fantastico.

(Tutte le mie immagini sono su disco localmente, quindi non ho bisogno di rete, quindi non penso che Volley sia adatto)

Risposte:


80

Aggiornamento settembre 2018: dopo diversi anni, avevo bisogno della stessa cosa per una soluzione di memorizzazione nella cache delle immagini locale. Questa volta, UIL non è stato in fase di sviluppo attivo. Ho confrontato le librerie popolari e la conclusione è piuttosto semplice: usa Glide. È molto più potente e configurabile. Anni fa ho dovuto fare il fork e apportare modifiche a UIL. Glide supporta tutti i miei casi d'uso in termini di strategia di memorizzazione nella cache e più livelli di memorizzazione nella cache di risoluzione con chiavi personalizzate. Usa solo Glide!

Il confronto di Koushik Dutta è principalmente per il benchmark di velocità. Il suo post ha toccato solo cose molto basilari e non è specifico per le immagini locali. Vorrei condividere le mie esperienze con Picasso e UIL dopo aver posto la domanda. Sia Picasso che UIL possono caricare immagini locali. Ho provato Picasso per la prima volta ed ero felice, ma in seguito ho deciso di passare a UIL per ulteriori opzioni di personalizzazione.

Picasso:

  • L'interfaccia fluente di Picasso è carina. Ma saltando in giro con "con", "dentro", "carico" in realtà non sai cosa c'è dietro le quinte. È confuso ciò che è stato restituito.

  • Picasso ti consente di specificare la dimensione esatta del bersaglio. È utile quando si hanno problemi di memoria o prestazioni, è possibile compromettere la qualità dell'immagine con la velocità.

  • Le immagini vengono memorizzate nella cache con le dimensioni nella relativa chiave, è utile quando si visualizzano immagini con dimensioni diverse.

  • È possibile personalizzare la dimensione della cache di memoria. Ma la sua cache del disco è solo per le richieste http. Per le immagini locali, se ti interessa la velocità di caricamento, è bene avere una cache del disco delle miniature in modo da non dover leggere ogni volta diversi MB per un'immagine. Picasso non dispone di questo meccanismo per ridimensionare e salvare le miniature su disco.

  • Picasso non espone l'accesso alla sua istanza di cache. (Puoi ottenerlo quando configuri Picasso per la prima volta e tienilo in giro ...).

  • A volte si desidera leggere in modo asincrono un'immagine in una bitmap restituita da un listener. Sorprendentemente Picasso non ce l'ha. La dose "fetch ()" non restituisce nulla. "get ()" è per la lettura sincrona e "load ()" è per disegnare una vista in modo asincrono.

  • Picasso ha solo pochi semplici esempi sulla homepage e dovrai leggere il javadoc non ordinato per usi avanzati.

UIL:

  • UIL utilizza i builder per la personalizzazione. Quasi tutto può essere configurato.

  • UIL non ti consente di specificare le dimensioni che desideri caricare in una vista. Utilizza alcune regole in base alle dimensioni della vista. Non è flessibile come Picasso. Non ho modo di caricare un'immagine a risoluzione inferiore per ridurre l'ingombro della memoria. (Modifica: questo comportamento può essere facilmente modificato aggiungendo un argomento ImageSize nel codice sorgente e ignorando il controllo delle dimensioni della vista)

  • UIL fornisce una cache del disco personalizzabile, puoi usarla per memorizzare nella cache le miniature con dimensioni specificate. Ma non è perfetto. Ecco i dettagli . (Modifica: se ti interessa la velocità e desideri più livelli di memorizzazione nella cache delle miniature, come il mio caso, puoi modificare il codice sorgente, lasciare che la cache del disco usi "memoryKey" e renderlo sensibile alle dimensioni)

  • UIL per impostazione predefinita memorizza nella cache immagini di dimensioni diverse e può essere disattivato nella configurazione.

  • UIL espone la memoria di supporto e la cache del disco a cui puoi accedere.

  • UIL fornisce modi flessibili per ottenere una bitmap o caricarla in una vista.

  • UIL è migliore nella documentazione. UIL fornisce gli usi dettagliati sulla pagina Github e c'è un tutorial collegato.

Suggerisco di iniziare con Picasso, se hai bisogno di più controllo e personalizzazione, scegli UIL.


In realtà sono bloccato tra i due ... essenzialmente riporterò le immagini dal mio server memorizzate in una directory lì ... quindi tramite le chiamate http e quindi le memorizzerò per la cache (miniatura e dimensione normale, probabilmente le memorizzerò entrambe le dimensioni sulla mia directory) ... è picasso la strada da percorrere allora?
Lion789

@ Lion789 Picasso fa solo la cache di memoria locale per i file locali e usa HttpResponseCache per la cache del disco di rete, devi esaminarlo. UIL ha una cache del disco configurabile, puoi apportare alcune piccole modifiche per far sì che accetti dimensioni diverse di immagini / miniature. Forse prova prima Picasso, se lo trovi troppo limitato, scegli UIL e personalizza
XY

Quindi Picasso può caricare immagini più piccole! Quindi non devo caricare quelli da 8 megapixel! Grazie, mi hai aiutato!
Aron Lorincz

Puoi rispondere a questa domanda per favore? stackoverflow.com/questions/35433895/…
Usman Rana

UIL does not allow you to specify the size you want to load into a viewnon è corretto al 100% .. con UIL puoi usarepublic void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
Martin Mlostek

72

Se leggi questo post su G + di Koush otterrai soluzioni chiare per le tue confusioni, ne ho messo il riassunto, in quel Android-Universal-Image-Loader è il vincitore per le tue esigenze!

  • Picasso ha le migliori API per le immagini se utilizzi la rete!

  • UrlImageViewHelper + AndroidAsync è il più veloce. Giocare con queste altre due fantastiche librerie ha davvero evidenziato che l'API dell'immagine è piuttosto datata, comunque.

  • La raffica è liscia; Mi piacciono molto i loro trasporti backend collegabili
    epotreifinire per far cadere AndroidAsync lì dentro. La priorità della richiesta
    e la gestione della cancellazione è ottima (se si utilizza la rete)

  • Android-Universal-Image-Loader è il più popolare
    attualmente disponibile. Altamente personalizzabile.

Questo progetto mira a fornire uno strumento riutilizzabile per il caricamento, la memorizzazione nella cache e la visualizzazione di immagini asincrone. È originariamente basato sul progetto di Fedor Vlasov e da allora è stato ampiamente modificato e migliorato.

Modifiche imminenti nella nuova versione UIL (1.9.2):

Possibilità di chiamare ImageLoader dal thread dell'interfaccia utente Nuova API Disk Cache (più flessibile). Nuovo LruDiscCache basato su DiskLruCache di Jake Wharton.

Considerando tutto questo Android-Universal-Image-Loader soddisfa le tue esigenze (il caricamento delle immagini è su disco in locale )!


Ho iniziato con Picasso e ho finito con il passaggio alla Universal, nonostante tutto fosse completamente implementato. Picasso ha un'interfaccia API migliore ma ha anche molti problemi. Questo era l'ultimo chiodo nella bara.
Lisandro

45

Vorrei condividere la mia esperienza con queste 3 biblioteche: UIL, Picasso e Volley. In precedenza ho usato UIL ma poi sono giunto alla conclusione che non posso davvero consigliarlo e suggerirei di usare invece Volley o Picasso, entrambi sviluppati da team di grande talento. La UIL non è affatto male ma manca della cura dei dettagli delle altre due librerie.

Ho trovato UIL meno piacevole con le prestazioni dell'interfaccia utente; tende a bloccare il thread dell'interfaccia utente più di Volley o Picasso. Ciò può essere in parte dovuto al fatto che UIL non supporta il batch delle risposte alle immagini mentre Picasso e Volley lo fanno per impostazione predefinita.

Inoltre, non mi piaceva il sistema di cache del disco di UIL. Sebbene sia possibile scegliere tra varie implementazioni, devo sottolineare che al momento non c'è modo di limitare la cache del disco UIL sia per dimensione totale che per tempo di scadenza dell'entità. Volley e Picasso lo fanno e usano il tempo di scadenza restituito dal server per impostazione predefinita mentre UIL lo ignora.

Infine, UIL ti consente di impostare una configurazione del caricatore di immagini globale che include la cache del disco selezionata e le implementazioni e le impostazioni della cache di memoria e altri dettagli, ma questa configurazione verrà applicata ovunque nella tua app. Quindi, se hai bisogno di maggiore flessibilità come due cache del disco separate, non puoi fare a meno di UIL. Volley d'altra parte ti consente di avere tutti i caricatori di immagini separati che desideri, ognuno con la propria configurazione. Picasso utilizza un'istanza globale per impostazione predefinita, ma consente anche di creare istanze configurabili separatamente.

Per riassumere: Picasso ha la migliore API ma utilizza la cache del disco HTTP globale condivisa tra tutte le HttpURLConnectionistanze, che in alcuni casi può essere troppo restrittiva. Volley ha le migliori prestazioni e modularità ma è meno facile da usare e richiederà la scrittura di uno o due moduli per farlo funzionare come desideri. Nel complesso, li consiglierei entrambi contro UIL.

Modifica (18 dicembre 2014): Le cose sono cambiate da quando ho scritto questa risposta iniziale e ho ritenuto necessario migliorarla:

Picasso 2.4 è ancora più configurabile rispetto alle versioni precedenti e, se utilizzato con OkHttp (che è altamente raccomandato), è anche in grado di utilizzare una cache del disco separata per ogni istanza, quindi non ci sono davvero restrizioni in ciò che puoi fare. Ancora più importante, ho notato che le prestazioni di Picasso e OkHttp sono migliorate molto e secondo me ora è la soluzione di caricamento immagini più veloce per Android, punto. Tieni presente che nel mio codice utilizzo sempre .fit()in combinazione con .centerCrop()o .centerInside()per ridurre l'utilizzo della memoria ed evitare il ridimensionamento delle bitmap nel thread dell'interfaccia utente. Picasso è attivamente sviluppato e supportato e questo è sicuramente un grande vantaggio.

Il Volley non è cambiato molto ma nel frattempo ho notato due problemi:

  • A volte sotto carico pesante, alcune immagini non vengono più caricate a causa di alcuni danneggiamenti della cache del disco.
  • Le miniature visualizzate in una NetworkImageView (con il tipo di scala impostato su centerCrop) sono piuttosto sfocate rispetto a ciò che si ottiene con le altre librerie.

Per questi motivi ho deciso di smettere di usare Volley.

UIL è ancora lento (specialmente la cache del disco) e la sua API ha la tendenza a cambiare abbastanza spesso.

Ho anche testato questa nuova libreria chiamata Glide 3 che afferma di essere più ottimizzata di Picasso con un'API simile a Picasso. Secondo la mia esperienza personale è effettivamente più lento di Picasso e Volley durante le richieste di rete sotto carico pesante, anche se utilizzato in combinazione con OkHttp. Peggio ancora, ha causato alcuni arresti anomali con le mie app sotto Lollipop quando si lascia un'attività. Ha ancora 2 vantaggi rispetto ai suoi concorrenti:

  • Supporta la decodifica di GIF animate
  • Mette le bitmap finali ridotte nella cache del disco, il che significa che la rilettura dalla cache del disco è estremamente veloce.

Conclusione: ora consiglio di utilizzare Picasso + OkHttp perché fornisce la migliore flessibilità, API, prestazioni e stabilità combinate. Se hai bisogno del supporto GIF puoi anche considerare Glide.


1
Per affrontare il tuo ultimo punto su UIL, puoi creare quante ImageLoaderclassi e configurazioni diverse desideri. Hai solo bisogno di sottoclassare la ImageLoaderclasse. Vedi qui: github.com/nostra13/Android-Universal-Image-Loader/issues/…
TalkLittle

Sembra un hack ma grazie per il suggerimento, è buono a sapersi.
BladeCoder

3
Non posso dire di essere d'accordo con il sentimento, usiamo Picasso qui, ho un album con oltre 500 immagini ad alta risoluzione e stavo incappando in problemi di prestazioni e memoria, ho provato UIL e le cose sono state risolte immediatamente. Questo è stato su un campione minimo che ha isolato i nostri problemi che stavamo vedendo.
HaMMeReD

Se stai visualizzando immagini che hanno una risoluzione molto più alta dello schermo o molte miniature di immagini ad alta risoluzione, dovresti assolutamente sottocampionarle. Penso che UIL lo faccia automaticamente e Picasso non lo fa se non specifichi le opzioni corrette, da qui i problemi di memoria. Personalmente preferisco usare NetworkImageView in Volley, è un widget che esegue il downsampling dell'immagine caricata alla sua dimensione.
BladeCoder

In UIL, la classe DisplayImageOptions può essere utilizzata se non si desidera modificare o applicare altre elaborazioni su una particolare immagine.
Rahul Rastogi

7

Ho implementato un'app che dovrebbe ricevere e mostrare costantemente immagini da Internet. Stavo per programmare un meccanismo di cache delle immagini, prima che un amico mi abbia consigliato il caricatore di immagini universale.

L'UIL è personalizzabile molto bene. È così personalizzabile che un principiante può facilmente fare qualcosa di sbagliato. Tuttavia, l'UIL era lento nella mia applicazione ed è diventato un po 'più lento. Il mio caso d'uso è stato un ListView con immagini.

Ieri stavo cercando un'alternativa alla UIL e ho scoperto Picasso. Picasso è stato facile da integrare e da usare: solo Picasso.context(context).load(url).into(imageview)e l'immagine potrebbe essere più veloce e facilmente integrata.

Per me Picasso è sicuramente l'API da usare. La mia esperienza con UIL non è stata buona.


Per i futuri lettori: Meglio di Picasso è Glide.
Dai

0

Penso che ImageLoader sia più personalizzabile e flessibile rispetto alla libreria Picasso.


8
Come? una piccola spiegazione aiuterà.
Darpan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.