Es casi imposible encontrar una aplicación comercial para Android que no utilice imágenes en su interfaz. La descarga de una imagen en la vista correspondiente, a pesar de la aparente sencillez de la operación, puede causar grandes problemas al desarrollador. Por ejemplo, ¿qué pasa si la imagen está almacenada en el servidor? Para mostrarla en la pantalla, deberá cargarla primero en el almacenamiento local, luego convertirla al formato deseado y añadirla como atributo en la Vista. La lista de tareas se ampliará considerablemente si queremos reutilizar las imágenes ya cargadas o mostrar el marcador de posición mientras se descarga la imagen deseada. Por ello, la gran mayoría de los proyectos Android utilizan librerías especiales – descargadores de imágenes que permiten romper este ciclo interminable. Las más comunes para 2020 son Picasso, Glide y Fresco.

Fue creada por Square, que es conocida por la comunidad Android por bibliotecas tan populares como Retrofit, OkHttp y Leak Canary. Los creadores de esta biblioteca ponen el énfasis principal en la simplicidad y la comprensibilidad del trabajo. El enfoque minimalista permite no inflar el tamaño del archivo apk – Picasso ocupa sólo 121 Kb. La biblioteca también ahorra el número de métodos de la aplicación, añadiendo sólo 849 de sus métodos. Esto aplaza el momento de convertir la aplicación en un archivo multidisco.

Es el producto de Bump Tech. Una de las características destacadas de la biblioteca es su potente funcionalidad, que le permite implementar complejas transformaciones de imagen. Sin embargo, tienen un precio: una aplicación más grande: Glide añade 440 Kb y 2678 métodos. Por lo tanto, el nicho de Glide en el desarrollo de aplicaciones Android es un programa con una compleja lógica de visualización de imágenes. Sin embargo, también es posible implementar soluciones más sencillas con su ayuda.

Fue creada por los ingenieros de Facebook. A la hora de cargar imágenes, esta biblioteca se centra en trabajar de forma eficiente con la memoria y la productividad. Especialmente significativa fue su ventaja sobre otros descargadores de imágenes en dispositivos con Android 4. Ahora la diferencia se ha reducido, pero Fresco sigue siendo líder en este ámbito. La segunda característica significativa de Fresco es el uso de su propio SimpleDraweeView en lugar del tradicional ImageView.

La comparación de las funciones simples de estas bibliotecas (carga de recursos, gestión de errores, marcadores de posición) no aportará mucho valor al desarrollador de Android, ya que estas funciones son intuitivas y fáciles de aprender en apenas una hora. Sería más interesante comparar las funciones avanzadas de Picasso, Glide y Fresco: el almacenamiento en caché y la transformación de imágenes, así como las herramientas únicas de cada biblioteca.

Almacenamiento en caché de imágenes

Picasso admite dos tipos de caché por defecto: Caché LRU de un 15% de la memoria RAM disponible para la aplicación, y caché de disco de 5 a 50 MB (depende del tamaño disponible de la memoria de sólo lectura). Para controlarlas se utilizan las funciones memoryPolicy() y networkPolicy(). La primera permite rechazar el acceso a la caché en línea durante la carga de la imagen (atributo MemoryPolicy.NO_CACHE) o no guardar la imagen descargada en la caché (atributo MemoryPolicy.NO_STORE). Con la ayuda de la segunda, se regula la caché del disco. Sus atributos NetworkPolicy.NO_CACHE y NetworkPolicy.NO_STORE funcionan igual que en MemoryPolicy. Otro atributo – NetworkPolicy.OFFLINE – ordena a Picasso que descargue los datos sólo de la caché, sin acceder a la red.

Por ejemplo, una solicitud de este tipo obligará a Picasso a descargar constantemente imágenes de la red.

El esquema de caché en Glide es más complejo. Tiene 4 niveles

  1. recursos activos (mostrados ahora en cualquier Vista)
  2. caché de memoria (datos en la RAM)
  3. recurso (imagen convertida y decodificada)
  4. Datos (imagen bruta guardada en el disco).

Por defecto, antes de acceder a un recurso externo, Glide busca una imagen adecuada en estos niveles por orden. Con este enfoque, una misma imagen puede tener varias versiones. Por ejemplo, utilizamos la misma imagen tanto en la lista como en la vista detallada. Pero en el primer caso, derivamos su parte utilizando el recorte central, en el segundo – la mostramos completamente. La caché contendrá dos versiones de esta imagen. Para distinguirlas, Glide utiliza claves que incluyen datos sobre la anchura y la altura de la imagen, las transformaciones, las opciones añadidas, el tipo de datos, etc. Para gestionar la caché, utilice la función diskCacheStrategy(), que toma los argumentos enum de DiskCacheStrategy. ALL (utiliza todos los niveles de caché y un recurso externo), DATA (escribe los datos sin procesar en la memoria de sólo lectura), RESOURCE (escribe los datos descodificados en la memoria de sólo lectura), NONE (no almacena los datos en la memoria persistente).

El ejemplo anterior de Picasso tendrá este aspecto:

Al igual que Picasso, Glide permite borrar la caché por completo o para una imagen concreta. Pero también permite controlarla con mayor precisión mediante la función signature() y las claves personalizadas.

La caché de Fresco también es jerárquica y tiene 3 niveles:

  1. Mapa de bits (imágenes descodificadas, listas para su visualización o post-procesamiento)
  2. Caché de memoria codificada (almacena las imágenes comprimidas en el estado original en la memoria)
  3. Disco (almacena las imágenes comprimidas en el estado original en el almacenamiento local).

La biblioteca utiliza la clase ImagePipeline para gestionar la caché. Ofrece la posibilidad de comprobar la presencia de imágenes en la caché, obtener imágenes en la caché o eliminarlas.

Una característica interesante de Fresco es la capacidad de crear una caché separada para almacenar imágenes pequeñas. Esto puede ser útil para aumentar el rendimiento de la aplicación.

Transformación de imágenes

Una de las principales ventajas de utilizar descargadores es la posibilidad de procesar las imágenes antes de su salida hacia el usuario. Picasso ofrece un conjunto de transformaciones simples incorporadas: redimensionar, centrarRecortar, centrarInterior, rotar. Para transformaciones más complejas, puede utilizar soluciones ya preparadas de bibliotecas gratuitas. Por ejemplo, una solución de Daichi Furiya(Wasabeef). Con ella, puede establecer fácilmente la forma compleja de la imagen, desenfocar o aplicar máscaras y filtros. También existe la opción de crear su propia transformación personalizada. Para ello, deberá heredar de la clase Transformación y prescribir la lógica para cambiar la imagen. También será necesario establecer una cadena clave única para esta transformación, que nos permitirá distinguir entre las imágenes procesadas en la caché.

El trabajo con las transformaciones en Glide es muy similar al de Picasso. Puede tomar las opciones incorporadas para modificar imágenes (las mismas que en Picasso más circleCrop, roundedCorners, granularRoundedCorners). Para casos más complejos, existen bibliotecas gratuitas: del ya mencionado Daichi Furiya(Wasabeef) o de Werbhelius. Si es necesario, siempre puede definir su propia transformación. Su implementación es ligeramente diferente a la de Picasso. En primer lugar, la interfaz de Transformación no se implementa a menudo directamente, sino con la ayuda de clases de utilidad, cada una de las cuales es responsable de transformar un determinado tipo de recurso: DrawableTransformation, BitmapTransformation, GifDrawableTransformation, MultiTransformation, etc. Para crear su transformación, necesita redefinir 4 métodos: equals() y hashcode() – para distinguir entre objetos de transformación, transform() – describe realmente el cambio en la imagen, updateDiskCacheKey() – permite identificar las imágenes modificadas en la caché.

Ejemplo de transformación personalizada en Glide

Entre los 3 descargadores en cuestión, Fresco es el que tiene las herramientas de transformación de imágenes más sofisticadas. La mayoría de ellas pueden aplicarse en el diseño xml, indicando los atributos correspondientes. Desde la perspectiva de la codificación, aplicarlas es más difícil. Por ejemplo, así es como se ve el redondeo de las esquinas cuando se utiliza Fresco.

Además, algunas herramientas estándar tienen limitaciones. Por ejemplo, el redimensionamiento sólo puede aplicarse al formato JPEG, no puede agrandar una imagen y sólo puede reducirla a ⅛ tamaño original.

Al igual que otros cargadores, Fresco puede utilizarse con bibliotecas de transformaciones ya hechas (del mismo Wasabeef ).

La creación de su transformación requiere una implementación personalizada de la clase Postprocessor. Reescribamos el ejemplo de la escala de grises con Glide para Fresco.

Características únicas

Dado que Picasso se basó en el principio de “nada más”, añadió la mayoría de las nuevas características más tarde que sus competidores, principalmente Glide.

Glide ha sido durante mucho tiempo un pionero en la adición de funcionalidades a los descargadores de imágenes en Android. Por el momento, puede destacar sus características más útiles

  1. cargar un fotograma de un vídeo como imagen
  2. uso de cualquier tipo de modelo en lugar de Uri / String para el cargador personalizado
  3. Descarga de GIF (también disponible en Fresco)
  4. aPI flexible con la capacidad de conectar cualquier pila de red (por ejemplo, Volley u OkHttp)

Fresco fue creado como un enfoque alternativo a la carga de imágenes en Android con un ojo en la eficiencia. Por lo tanto, sus principales características están ocultas bajo el capó:

  1. guardar las imágenes no en el heap de Java, sino en el heap de ashmem, lo que ahorra memoria a las aplicaciones, reduce los riesgos de OutOfMemoryError y aumenta el rendimiento debido a que las llamadas al recolector de basura son más raras;
  2. recorte de imágenes alrededor de cualquier punto, no sólo en el centro;
    redimensionamiento de JPEG utilizando recursos nativos, lo que también reduce los riesgos de OutOfMemoryError;
  3. soporte para imágenes JPEG progresivas.

Conclusión

Criterio
Tamaño 121 Kb/td&gt

440 Kb 500 kb
Comodidad de uso alto alto medio
Velocidad de descarga de la web alta ligeramente inferior debido al largo procesamiento de la caché alta
Velocidad de descarga en caché media alta alta
Características de transformación incorporadas conjunto básico de operaciones conjunto básico más redondeo amplia gama de capacidades de transformación, pero con limitaciones
Herramientas adicionales Ausencia. Carga de un fotograma de vídeo como imagen y GIF, utilizando cualquier tipo de modelo, una API flexible con la capacidad de conectar cualquier pila de red. Guardado de imágenes no en Java Heap, sino en ashmem heap, capacidad de recortar imágenes alrededor de cualquier punto, redimensionar JPEG utilizando recursos nativos, soporte para imágenes JPEG Progresivas.
Tamaño 121 Kb
Comodidad de uso alta
Velocidad de descarga de la web alta
Velocidad de descarga de la caché media
Características de transformación incorporadas conjunto básico de operaciones
Herramientas adicionales Ausente.
Tamaño 440 Kb
Comodidad de uso alta
Velocidad de descarga de la web Ligeramente inferior debido al prolongado procesamiento de la caché
Velocidad de descarga en caché alta
Características de transformación incorporadas conjunto básico más redondeo
Herramientas adicionales Carga de un fotograma de vídeo como imagen y GIF, utilizando cualquier tipo de modelo, una API flexible con la capacidad de conectar cualquier pila de red.
Tamaño 500 kb
Comodidad de uso medio
Velocidad de descarga de la web alta
Velocidad de descarga de la caché alta
Funciones de transformación incorporadas amplia gama de capacidades de transformación, pero con limitaciones
Herramientas adicionales Guardar las imágenes no en el Heap de Java, sino en el Heap de ashmem, capacidad de recortar las imágenes alrededor de cualquier punto, redimensionar JPEG utilizando recursos nativos, soporte para imágenes JPEG Progresivas.

Así, para 2020, Picasso, Glide y Fresco son las bibliotecas más populares para descargar imágenes en las aplicaciones Android. Cada una de ellas tiene sus propias especificidades en cuanto al uso de herramientas avanzadas, el almacenamiento en caché y la transformación de imágenes en particular. Picasso, con un enfoque minimalista, funciona bien con operaciones de imagen sencillas, pero tiene opciones de personalización limitadas. Glide es un líder indiscutible entre los descargadores de Android, ya que ofrece una potente funcionalidad y una interfaz intuitiva para su aplicación. El enfoque innovador de Fresco ofrece mejoras de rendimiento, pero complica enormemente la implementación del almacenamiento en caché y la transformación de imágenes.

uvallie
Alex Shteinle

Desarrollador de Android en Redwerk