English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Questo è il contenuto che ho condiviso a MDCC (con alcune modifiche), e anche quando è stato pubblicato il primo episodio di analisi del codice sorgente, è stato introdotto come cosa faremo gradualmente in futuro.
Confronta le diverse cache di immagini in termini di progettazione generale e principio, anche chi non le ha mai usate può comprendere le loro implementazioni in alcune caratteristiche.
Primo. Informazioni di base sulle quattro principali cache di immagini
Universal ImageLoader è una cache di immagini open source molto antica, utilizzata da molte applicazioni negli anni iniziali.
Picasso è un progetto open source di Square, e il suo leader è JakeWharton, quindi è noto a molti.
Glide è un progetto open source di un dipendente di Google, utilizzato da alcuni Google App, raccomandato durante il Google I/O dell'anno scorso, ma attualmente ci sono pochi materiali in Cina.
Fresco è stato open source da Facebook quest'anno in primavera, e le sue caratteristiche principali includono:
(1) Due cache della memoria più la cache nativa formano un sistema di cache di livello tre
(2) Supporta lo streaming, può mostrare immagini in modo simile alla visualizzazione sfocata e progressiva delle pagine web
(3) Migliore supporto per animazioni a più frame, come Gif, WebP
Vista l'assenza di una versione ufficiale 1.0 di Fresco e il fatto che non ci sia stato molto tempo per familiarizzare con il codice sorgente di Fresco, il confronto successivo non includerà Fresco, che sarà aggiunto in futuro quando ci sarà tempo.
Più librerie di cache di immagini sono disponibili: librerie di cache di immagini Android
Secondo, concetti di base
Prima di confrontare ufficialmente, è utile comprendere alcune concetti comuni delle cache di immagini:
(1) RequestManager: modulo di generazione e gestione delle richieste
(2) Engine: parte dell'engine, responsabile della creazione di task (acquisizione dei dati) e della pianificazione dell'esecuzione
(3) GetDataInterface: interfaccia di acquisizione dei dati, responsabile dell'acquisizione dei dati da diverse fonti di dati.
Ad esempio, MemoryCache per ottenere dati dalla cache della memoria, DiskCache per ottenere dati dalla cache locale, downloader per ottenere dati dalla rete, ecc.
(4) Displayer: risorsa (immagine) display, utilizzato per visualizzare o operare risorse.
Ad esempio, ImageView, queste cache di immagini non supportano solo ImageView, ma anche altri View e concetti di Displayer virtuale.
(5) Processor risorse (immagini) processore
Responsabile del trattamento delle risorse, come rotazione, compressione, taglio e altro.
Le denominazioni di questi concetti possono variare in diverse cache di immagini, ad esempio Displayer in ImageLoader è chiamato ImageAware, in Picasso e Glide è chiamato Target.
Tre, vantaggi comuni
1. Facile da usare
Tutti possono ottenere e visualizzare immagini con una singola riga di codice.
2. Alta configurabilità e adattabilità
Il downloader di cache delle immagini (meccanismo di retry), il decodificatore, il display, il processore, la cache in memoria, la cache locale, il pool di thread, l'algoritmo di cache e altri possono essere configurati facilmente.
Adattabilità elevata, configurazione della cache inizializzata in base alle prestazioni del sistema, e strategia dinamica adattata dopo la modifica delle informazioni di sistema.
Ad esempio, determinare il numero massimo di concorrenza in base al numero di core del CPU, determinare la dimensione della cache in memoria in base alla memoria disponibile, e adattare il numero massimo di concorrenza quando cambia lo stato di rete.
3. Cache multi-livello
Tutti hanno almeno due livelli di cache, migliorando la velocità di caricamento delle immagini.
4. Supporto per diverse fonti di dati
Supporta diverse fonti di dati, tra cui rete, locale, risorse, Assets e altri.
5. Supporto per vari Displayer
Non supporta solo ImageView, ma anche altri View e concetti di Displayer virtuale.
Altri piccoli punti comuni includono supporto per animazioni, supporto per trasformazioni, recupero di informazioni EXIF e altro.
Quattro, progettazione e vantaggi di ImageLoader
1. Progettazione complessiva e flusso
Di seguito è riportato il diagramma di progettazione generale di ImageLoader. L'intera libreria è divisa in cinque grandi moduli: ImageLoaderEngine, Cache e ImageDownloader, ImageDecoder, BitmapDisplayer e BitmapProcessor, tra cui Cache è divisa in MemoryCache e DiskCache.
In modo semplice, è il compito di ImageLoader di ricevere l'incarico di caricare e visualizzare le immagini, che poi consegna a ImageLoaderEngine. ImageLoaderEngine distribuisce il compito a un pool di thread specifici per l'esecuzione, il compito recupera le immagini tramite Cache e ImageDownloader, che potrebbero passare attraverso BitmapProcessor e ImageDecoder per il trattamento, infine convertite in Bitmap e consegnate a BitmapDisplayer per la visualizzazione in ImageAware.
2. Vantaggi di ImageLoader
(1) Supporta l'ascolto del progresso del download
(2) Può sospendere il caricamento delle immagini durante lo scorrimento della View
Tramite l'interfaccia PauseOnScrollListener è possibile sospendere il caricamento delle immagini durante lo scorrimento della View.
(3) Implementazione predefinita di più algoritmi di cache in memoria Queste cache di immagini possono essere configurate con algoritmi di cache, ma ImageLoader implementa per impostazione predefinita più algoritmi di cache, come Size massima prima di essere cancellata, utilizzo iniziale prima di essere cancellato, utilizzo più recente prima di essere cancellato, in primo luogo in primo luogo prima di essere cancellato, il più lungo nel tempo prima di essere cancellato e così via.
(4) Supporta la definizione delle regole di nome dei file di cache locale
V, Progettazione e vantaggi di Picasso
1. Progettazione complessiva e flusso
L'immagine di progettazione generale di Picasso sopra. L'intera libreria è divisa in moduli come Dispatcher, RequestHandler e Downloader, PicassoDrawable e così via.
Il Dispatcher è responsabile della distribuzione e della gestione delle azioni, inclusi il submit, il pause, il continue, il cancel, il cambiamento di stato di rete, il retry e così via.
In parole semplici, Picasso riceve il compito di caricamento e visualizzazione delle immagini, crea una Request e la consegna al Dispatcher, il Dispatcher distribuisce il compito al RequestHandler specifico, il compito recupera l'immagine attraverso MemoryCache e Handler (interfaccia di dati), e l'immagine viene visualizzata nel Target tramite PicassoDrawable.
È necessario notare la parte di File system di Data sopra, Picasso non ha un'interfaccia di cache locale personalizzata, utilizza il cache locale di http per impostazione predefinita, utilizza okhttp per API 9 e superiori, utilizza Urlconnection per quelli inferiori, quindi se è necessario personalizzare il cache locale, è necessario ridare definizione al Downloader.
2. Vantaggi di Picasso
(1) Funzione di monitoraggio e statistica integrata
Supporta la monitoraggio dell'uso della cache delle immagini, inclusi il tasso di hit della cache, la dimensione della memoria utilizzata, il traffico risparmiato e così via.
(2) Supporta la gestione della priorità
Prima di ogni pianificazione del compito, verrà selezionato il compito con priorità alta, ad esempio, quando la priorità del Banner nella pagina dell'app è superiore a quella dell'icona, è molto utile.
(3) Supporta il ritardo fino al completamento del calcolo delle dimensioni dell'immagine
(4) Supporta la modalità aerea e il numero di thread concorrenti varia in base al tipo di rete
Il telefono si passa automaticamente in modalità aereo o cambia il tipo di rete, regolando automaticamente il numero massimo di connessioni contemporanee del pool di thread, ad esempio, il wifi massimo è 4, 4g è 3, 3g è 2.
Qui Picasso decide il numero massimo di connessioni contemporanee in base al tipo di rete, non al numero di core del CPU.
(5) “Nessuna” cache locale
(5) “Nessuna” cache locale, non significa che non ci sia una cache locale, ma che Picasso non l'ha implementata e ha delegato a un'altra libreria di rete di Square, okhttp, il compito di implementarla. Questo ha il vantaggio che è possibile controllare la scadenza delle immagini attraverso il Cache-Control e l'Expired presente nell'header di risposta delle richieste.
Sezione sesta: Progettazione e vantaggi di Glide
1. Progettazione complessiva e flusso
Ecco la diagramma di progettazione complessiva di Glide. L'intera libreria è suddivisa in moduli come RequestManager (gestore delle richieste), Engine (motore di acquisizione dei dati), Fetcher (acquisitore dei dati), MemoryCache (cache in memoria), DiskLRUCache, Transformation (elaborazione delle immagini), Encoder (memorizzazione locale), Registry (configurazione del tipo di immagine e parser), e Target (obbiettivo).
In poche parole, Glide riceve il compito di caricare e visualizzare risorse, crea una Request e la consegna a RequestManager, la Request avvia l'Engine per ottenere risorse dallo stesso (attraverso Fetcher), e una volta ottenute, le trasforma e le consegna al Target.
Glide dipende da librerie open source come DiskLRUCache e GifDecoder per completare il lavoro di cache locale e decodifica di immagini Gif.
2. Vantaggi di Glide
(1) Cache di immagini -> Cache di media
Glide non è solo un cache di immagini, supporta anche Gif, WebP, miniature. È persino in grado di gestire Video, quindi dovrebbe essere considerato un cache di media.
(2) Supporta la gestione della priorità
(3) Coerente con il ciclo di vita di Activity/Fragment, supporta trimMemory
Glide mantiene un RequestManager per ogni context, mantenendo coerenza con il ciclo di vita di Activity/Fragment tramite FragmentTransaction e offrendo un'interfaccia trimMemory per la chiamata.
(4) Supporta okhttp e Volley
Glide predefinitamente utilizza UrlConnection per ottenere dati, e può essere utilizzato insieme a okhttp o Volley. In effetti, ImageLoader e Picasso supportano anche okhttp e Volley.
(5) Amico della memoria
① La cache in memoria di Glide ha un design attivo
Quando si recuperano dati dalla cache in memoria, non si utilizza get come negli altri implementazioni, ma remove, quindi questo dati di cache vengono messi in una mappa di activeResources con valore di riferimento morbido e si contano i riferimenti, si giudica dopo che l'immagine è stata caricata, se il conteggio dei riferimenti è vuoto, si recupera.
② Le immagini nella cache in memoria sono più piccole
Glide utilizza url, view_width, view_height, risoluzione dello schermo come chiavi composite, memorizza le immagini elaborate nella cache in memoria, piuttosto che le immagini originali per risparmiare spazio
③ Coincide con il ciclo di vita di Activity/Fragment e supporta trimMemory
④ L'immagine utilizza di default RGB_565 invece di ARGB_888
Sebbene la risoluzione sia inferiore, le immagini sono più piccole e possono essere configurate in ARGB_888.
Altri: Glide può supportare l'elaborazione dell'url con signature o senza cache locale
Settimo: Sommario
In generale, le funzioni di ImageLoader e la lunghezza del proxy sono facili da comprendere, ma di solito sono di lunghezza media.
Il codice di Picasso è contenuto in un solo pacchetto, senza una distinzione rigorosa tra pacchetti, ma il codice è semplice, la logica chiara e si può ottenere una comprensione approfondita in un paio d'ore.
Glide è molto potente, ma il codice è voluminoso e il flusso è complesso. Si consiglia di utilizzarlo solo dopo una comprensione più profonda, per evitare difficoltà nel risolvere problemi.
Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento, e speriamo che tutti supportino la guida di urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è della proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.