viernes, 7 de marzo de 2014

Picasso, otra importante libreria

Continuamos con las presentaciones de librerias y "cosas utiles" a la hora de programar Aplicaciones robustas, que van mas alla del "Hola Mundo" o pruebas de concepto aisladas.
Ahora, vamos a hablar de una de las librerías para Android, Picasso, que se utiliza para desarrollar  aplicaciones para Android y que, como desarrollador, recomiendo. 
picasso
Picasso © Square Inc.
Si alguna vez has tratado de desarrollar una aplicación para Android, o saber cómo diseñar una, lo más seguro es que tenga imágenes y, sin duda, éstas las descargarás de Internet. 
Tratar con imágenes en Android es muy difícil para un principiante y, especialmente, frustrante si no tienes la suficiente experiencia en informática. Por suerte, la web oficial de Desarrolladores Android ofrece gran cantidad de información y documentación sobre este tema acompañado de proyectos de ejemplo que harán el proceso mucho más fácil. 
Si eres un desarrollador de Android a tiempo completo, estoy seguro de que has desarrollado tu propia versión de AwesomeAsyncImageView.java. ¡Todos lo hacemos!
Puesto que mi intención es que este artículo sea entendido por la mayoría de las personas que utilizan Android y, además, se interesen por algunos técnicos, vamos a empezar por algunos problemas comunes cuando se trata con imágenes. 
En primer lugar, recordemos que la batería es lo que alimenta la CPU. Por tanto, mientras más lo uses, menos batería tendrás.  Algo obvio para todos. Así que, si queremos desarrollar una aplicación que muestre una lista de noticias, puede que sea más conveniente que solo muestre una imagen y el título. 

El problema ANR

anr
Un diálogo ANR (Aplicación No Responde) mostrado al usuario. / © Creative Commons Attribution 2.5
Para empezar, tenemos que ponernos en contacto con el servidor para pedir algunas noticias (el formato en el que el servidor responde no importa ahora). Por ejemplo, nos pueden dar un título y una URL para la imagen. Así, solo tenemos que comenzar a descargar las imágenes una tras otra hasta que nos aparezca el terrible mensaje ANR (Aplicación No Responde). 
El motivo principal es que tu aplicación está tan ocupada descargando imágenes sin parar que no ha tenido tiempo a 'dibujarse' a sí misma en la pantalla, por lo que el Android OS piensa que la aplicación se ha colgado. Por supuesto, el usuario siempre puede pulsar la tecla de 'Esperar' y dejar que la app termine su trabajo, pero esto solo supondría una pésima experiencia de usuario (UX)

La introducción de 'threads'

La mejora de la UX de nuestra aplicación nos obligará a aprender el concepto de 'threads' (hilos o temas). Los 'threads' son solo unidades de ejecución concurrentes, lo que significa que se ejecutan al mismo tiempo y cada aplicación tiene por lo menos un hilo conductor, generalmente el hilo de interfaz de usuario (UI). Este hilo es responsable de señalar a la aplicación en la pantalla. 
Este problema se resuelve fácilmente mediante la creación de un nuevo 'thrad' que pueda descargar las imágenes en el fondo y así cuando haya terminado puede comunicar al hilo de UI que las imágenes se han descargado para que pueda mostrarlas. De esta forma se evita la aparición del problema ANR. 

El problema de la rotación de pantalla

En el momento que giramos la pantalla de nuestro dispositivo la aplicación tiene que volverse a dibujar, básicamente porque lo más seguro es que tengas un diseño opmitizado del layout y, lamentablemente, hay que descargar las imágenes otra vez. Una pérdida de energía en términos de batería que también se pueden traducir en unos cuantos kilobytes de datos de tu tráfico mensual. 

La solución de la memoria caché

Es el momento en el que te sientas familiarizado con el concepto 'caché'. Simplemente se trata de un componente de la aplicación donde se van a almacenar datos de manera que en futuras solicitudes el servidor pueda ser más rápido. Un caché puede hacer que tu aplicación utilice más memoria, por supuesto, pero la memoria es barata y los beneficios son mucho mayores que el uso de la memoria. 
Con un caché tu aplicación se comporta de la siguiente manera: el 'thread' de UI le comunica al cache que necesita cierta imagen, por ejemplo, 'nexus4.png'. El caché no tiene nada (llamado error de caché), por lo que descarga una imagen y se la da al 'thread' de UI, y de paso la mantiene en la memoria. En el momento de girar la pantalla, el subproceso de UI pide de nuevo la imagen, pero esta vez la memoria caché está preparada (llamado acierto de caché) y no tiene que descargar la imagen de nuevo. Estamos en el 2013, no deberíamos preocuparnos por los kilobytes extra de memoria si conseguimos que la aplicación sea rápida y ahorre energía

El problema 'cerra app' 

Nuestro último problema. Seguro que a más de uno le habrá pasado que al pulsar el botón 'Atrás', Android la cierra y tenemos que abrirla otra vez. Por desgracia, tendrás que descargar todo de nuevo. Tengo tu solución, pero una vez más hará que se utilice más memoria, en este caso, interna, pero no debería importarte demasiado porque el espacio en el disco es muy barato. En vez de usar únicamente memoria caché, también se puede almacenar caché en el disco. Tu aplicación se comportará como antes, pero esta vez, después de dar la imagen que el 'thread' de UI haya solicitado, la misma se almacenará en el disco. Así, si la aplicación se cierra inesperadamente no necesitamos descargar la imagen de nuevo. 
picasso debug
Como opción Debug para desarrolladores, Picasso puede mostrar la fuente de donde proviene la foto: servidor, memoria interna o RAM. / © Square Inc.

Conclusión

Para terminar, lo mejor para evitar estos problemas es una herramienta como la librería Picasso, puesto que es capaz en una sola línea de código de encargarse de esto. Así, como desarrollador podrás invertir tu tiempo en cosas más interesantes que la gestión de imágenes. 
Espero que hayas aprendido un poco más sobre el comportamiento de aplicaciones en Android. 

No hay comentarios:

Publicar un comentario