English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Principio de almacenamiento en caché de imágenes en Android, comparación de características

Esto es lo que compartí en MDCC (con ligeras modificaciones), también es lo que se introdujo cuando se lanzó el primer episodio de análisis de código fuente, y el análisis de código fuente seguirá lentamente.

Comparación desde el diseño general y los principios de varias bibliotecas de caché de imágenes, incluso aquellos que no las han utilizado pueden entender sus implementaciones en ciertas características.

I. Información básica de las cuatro principales bibliotecas de caché de imágenes


Universal ImageLoader es una biblioteca de caché de imágenes abierta hace mucho tiempo, utilizada por muchas aplicaciones en la etapa inicial.

Picasso es un proyecto de código abierto de Square, y su líder es JakeWharton, por lo que es muy conocido.

Glide es un proyecto de código abierto de empleados de Google, utilizado por algunas aplicaciones de Google, en el Google I de año pasado/Recomendado en Android O, aunque hay pocos materiales en China en la actualidad.

Fresco es una biblioteca de caché de imágenes abierta por Facebook a principios de este año, sus características principales incluyen:
(1Dos cachés de memoria más el caché nativo forman un caché de tres niveles

(2Soporte para flujo, puede mostrar imágenes de manera similar a la progresiva y borrosa en las páginas web

(3Mejor soporte para imágenes animadas multi-quad, como Gif, WebP

Dado que Fresco aún no ha lanzado una versión oficial 1Versión 0, y no he tenido mucho tiempo para familiarizarme con el código fuente de Fresco, por lo que la comparación no incluye Fresco, que se añadirá en el futuro cuando tenga tiempo.

Más bibliotecas de caché de imágenes disponibles: Bibliotecas de caché de imágenes de Android

II. Conceptos básicos

Antes de comparar formalmente, primero conozcamos algunos conceptos comunes de caché de imágenes:
(1RequestManager: Módulo de generación y gestión de solicitudes

(2Engine: Parte del motor, responsable de crear tareas (obtener datos) y planificar su ejecución

(3GetDataInterface: Interfaz de obtención de datos, responsable de obtener datos de diversas fuentes de datos.
Por ejemplo, MemoryCache para obtener datos del caché de memoria, DiskCache para obtener datos del caché local, y el descargador para obtener datos de la red, etc.

(4Displayer: Recursos (imagen) visualizador, utilizado para mostrar o operar recursos.
Por ejemplo, ImageView, estas cachés de imágenes no solo admiten ImageView, sino que también admiten otros View y el concepto virtual de Displayer.

(5) Processor de recursos (imágenes) procesador
Responsable de procesar recursos, como rotación, compresión, recorte, etc.

El nombre de estos conceptos puede variar en diferentes cachés de imágenes, por ejemplo, Displayer en ImageLoader se llama ImageAware, en Picasso y Glide se llama Target.

Tres, ventajas comunes

1. Fácil de usar
Todo puede realizarse con una sola línea de código para obtener y mostrar imágenes.

2. Alta configurabilidad, alta adaptabilidad
La descarga de la caché de imágenes (mecanismo de reintentos), el decodificador, el visualizador, el procesador, la caché en memoria, la caché local, el pool de hilos, los algoritmos de caché, etc., se pueden configurar fácilmente.

Altamente adaptable, inicializa la configuración de la caché según el rendimiento del sistema y ajusta la estrategia dinámicamente después de que se cambien las información del sistema.
Por ejemplo, determinar el número máximo de concurrencias según el número de núcleos del CPU, determinar el tamaño de la caché de memoria según la memoria disponible, ajustar el número máximo de concurrencias según el cambio del estado de la red, etc.

3. Caché de múltiples niveles
Tienen al menos dos niveles de caché, lo que mejora la velocidad de carga de imágenes. 

4. Admite varias fuentes de datos
Admite varias fuentes de datos, como red, local, recursos, Assets, etc.

5. Admite varios Displayer
No solo admite ImageView, sino que también admite otros View y el concepto virtual de Displayer.

Otras pequeñas similitudes incluyen soporte para animaciones, soporte para procesamiento de transformaciones, obtención de información EXIF, etc.

Cuatro, diseño y ventajas de ImageLoader

1. Diseño general y flujo

Aquí está el diagrama de diseño general de ImageLoader. La biblioteca se divide en cinco grandes módulos: ImageLoaderEngine, Cache y ImageDownloader, ImageDecoder, BitmapDisplayer y BitmapProcessor, donde Cache se divide en MemoryCache y DiskCache.

En términos simples, es decir, ImageLoader recibe la tarea de cargar y mostrar imágenes y la entrega a ImageLoaderEngine, que distribuye la tarea a un pool de hilos específico para su ejecución. La tarea obtiene la imagen a través de Cache y ImageDownloader, que puede pasar por el procesamiento de Bitmap y ImageDecoder, y finalmente se convierte en Bitmap para que BitmapDisplayer lo muestre en ImageAware.

2. Ventajas de ImageLoader

(1) Soporte para escucha de progreso de descarga

(2) Puede pausar la carga de imágenes durante el desplazamiento de la View
A través de la interfaz PauseOnScrollListener se puede pausar la carga de imágenes durante el desplazamiento de la View.

(3) Implementación por defecto de varios algoritmos de caché en memoria Todos estos cachés de imágenes pueden configurar algoritmos de caché, sin embargo, ImageLoader por defecto implementa muchos algoritmos de caché, como el más grande primero en ser eliminado, el primero en usar primero en ser eliminado, el más reciente en ser utilizado primero en ser eliminado, el primero en entrar primero en ser eliminado, el más antiguo en entrar primero en ser eliminado, etc.

(4) Soporte para la definición de reglas de nombre de archivo de caché local

Cinco, diseño y ventajas de Picasso

1. Diseño general y flujo

La imagen de diseño general de Picasso se muestra aquí. La biblioteca se divide en módulos como Dispatcher, RequestHandler y Downloader, PicassoDrawable, etc.

Dispatcher se encarga de distribuir y procesar acciones, incluyendo presentación, pausa, continuación, cancelación, cambio de estado de red, reintentos, etc.

En términos simples, Picasso recibe la tarea de carga y visualización de imágenes, crea una solicitud y la entrega al Dispatcher, el Dispatcher distribuye la tarea al RequestHandler específico, la tarea obtiene la imagen a través de MemoryCache y Handler (interfaz de datos de obtención) y luego la muestra en el Target a través de PicassoDrawable.

Es necesario prestar atención a la parte de File system de Data mencionada anteriormente, Picasso no tiene interfaz de caché local personalizada, por defecto utiliza la caché local de http, API 9 Porque se utiliza okhttp aquí y Urlconnection allí, por lo que si se necesita personalizar la caché local, se debe redefinecir Downloader.

2. Ventajas de Picasso

(1) Función de estadísticas y monitoreo integrada
Soporte para la supervisión del uso de la caché de imágenes, incluyendo la tasa de acierto de la caché, el tamaño de la memoria utilizada, el tráfico ahorrado, etc.

(2) admite el procesamiento de prioridades
Antes de cada programación de tareas, se selecciona la tarea con mayor prioridad, por ejemplo, cuando la prioridad del Banner en la página de la aplicación es mayor que la del Icono, es muy aplicable.

(3) Soporte para retardar la carga hasta que se calcule el tamaño de la imagen

(4) Soporte para modo de vuelo, el número de hilos concurrentes varía según el tipo de red
cuando el teléfono cambia al modo avión o cambia el tipo de red, se ajusta automáticamente el número máximo de operaciones concurrentes del pool de hilos, por ejemplo, el número máximo de operaciones concurrentes para wifi es 4, 4g es 3,3g es 2.
Aquí Picasso decide el número máximo de operaciones concurrentes según el tipo de red, no según el número de núcleos del CPU. 

(5) “No tiene” caché local
No tiene “caché local”, no es que no tenga caché local, sino que Picasso no lo implementa y lo delega a otra biblioteca de red de Square, okhttp, lo que tiene la ventaja de que se puede pasar por alto el Cache en el encabezado de respuesta de la solicitud.-Control y Expired controlan el tiempo de expiración de las imágenes.

Seis, diseño y ventajas de Glide

1. Diseño general y flujo

La imagen de diseño general de Glide se muestra a continuación. Toda la biblioteca se divide en RequestManager (gestor de solicitudes), Engine (motor de obtención de datos), Fetcher (obtenedor de datos), MemoryCache (caché de memoria), DiskLRUCache, Transformation (procesamiento de imágenes), Encoder (almacenamiento de caché local), Registry (configuración de tipos de imágenes y analizadores), Target (objetivo) y otros módulos.

En términos simples, Glide recibe la tarea de cargar y mostrar recursos, crea una solicitud y la entrega al RequestManager, la solicitud inicia el Engine para obtener recursos de la fuente de datos (a través de Fetcher), y después de obtenerlos, el Transformation los entrega al Target.

Glide depende de DiskLRUCache, GifDecoder y otras bibliotecas de código abierto para completar el trabajo de caché local y decodificación de imágenes Gif.

2. Ventajas de Glide

(1) Caché de imágenes-> Caché de medios
Glide no es solo un caché de imágenes, admite Gif, WebP, miniaturas. Incluso Video, por lo que debería considerarse más como un caché de medios. 

(2) admite el procesamiento de prioridades

(3) con Activity/La vida útil del Fragment es la misma, y admite trimMemory
Glide mantiene un RequestManager para cada contexto, y mantiene la relación con Activity a través de FragmentTransaction/La vida útil del Fragment es consistente y tiene una implementación de interfaz trimMemory correspondiente para llamar.

(4) admite okhttp y Volley
Glide por defecto obtiene datos a través de UrlConnection, y puede usarse junto con okhttp o Volley. En realidad, ImageLoader y Picasso también admiten okhttp y Volley.

(5) Amigable con la memoria
① Glide tiene un diseño activo para la caché de memoria
Al obtener datos de la caché de memoria, no se utiliza get como en la implementación común, sino remove, y luego poner estos datos de caché en un mapa de activeResources con valor de referencia blanda, y contar el número de referencias, y realizar un juicio después de que la imagen se haya cargado, si el número de referencias es cero, se reciclará.

② La caché de memoria es más pequeña para las imágenes
Glide utiliza url, view_width, view_height, resolución de la pantalla, etc. como clave combinada, y almacena las imágenes procesadas en la caché de memoria en lugar de las imágenes originales para ahorrar espacio

③ Con Activity/La vida útil del Fragment es la misma, y admite trimMemory

④ Las imágenes utilizan por defecto el RGB_ predeterminado565 en lugar de ARGB_888
Aunque la claridad es menor, las imágenes son más pequeñas y también se pueden configurar en ARGB_888.

Otro: Glide puede soportar la expiración de url a través de signature o sin usar caché local

Séptimo, Resumen


En términos generales, la funcionalidad y la longitud del proxy de ImageLoader son fáciles de entender, pero generalmente son promedio. 

El código de Picasso está en un solo paquete, sin una división estricta de paquetes, pero es simple y lógico, se puede tener una comprensión profunda en una o dos horas.

Glide es muy potente, pero tiene mucho código y un flujo complejo. Solo se recomienda usarlo después de una comprensión más profunda, para evitar que sea difícil manejar problemas.

Esto es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos nos apoyen en el tutorial de clamor.

Declaración: El contenido de este artículo se ha obtenido de la red, y pertenece a los autores originales. El contenido ha sido contribuido y subido por usuarios de Internet, este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar, y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustaría que te gustara