Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Una introducción a Volley

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called An Introduction to Volley.
Creating a Weather Application for Mars Using Volley

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Volley es una biblioteca de redes desarrollada por Google e introducida durante Google I / O 2013. Se desarrolló debido a la ausencia, en el SDK de Android, de una clase de red capaz de funcionar sin interferir con la experiencia del usuario.

Hasta el lanzamiento de Volley, la clase canónica Java java.net.HttpURLConnection y Apache org.apache.http.client eran las únicas herramientas disponibles para los programadores de Android para desarrollar un sistema RESTful entre un cliente y un backend remoto.

Dejando de lado por un momento el hecho de que estas dos clases no están exentas de errores, debe tenerse en cuenta que todo lo que va más allá de una simple transacción HTTP debe escribirse ex novo. Si desea almacenar en caché las imágenes o priorizar las solicitudes, debe desarrollarlas desde cero.

Afortunadamente, ahora existe Volley, creado y adaptado para satisfacer estas necesidades.

1. ¿Por qué Volley?

Evite HttpUrlConnection y HttpClient

En niveles inferiores de API (principalmente en Gingerbread y Froyo), HttpUrlConnection y HttpClient están lejos de ser perfectos. Hay algunos problemas conocidos e errores que nunca fueron corregidos. Además, HttpClient quedó en desuso en la última actualización de la API (API 22), lo que significa que ya no se mantendrá y puede eliminarse en una versión futura.

Estas son razones suficientes para decidir cambiar a una forma más confiable de manejar sus solicitudes de red.

Y también evite AsyncTask

Desde la introducción de Honeycomb (API 11), ha sido obligatorio realizar operaciones de red en un hilo separado, diferente del hilo principal. Este cambio sustancial condujo al uso masivo de la especificación AsyncTask<Params, Progress, Result>.

Con AsyncTask, primero define algunas acciones preparatorias, como la definición del contexto, en onPreExecute. A continuación, realice sus tareas asincrónicas utilizando el método doInBackground. Finalmente, maneja los resultados en onPostExecute. Es bastante sencillo, mucho más fácil que la implementación de un servicio, y viene con un montón de ejemplos y documentación.

El principal problema, sin embargo, es la serialización de las llamadas. Al usar la clase AsyncTask, no puede decidir qué solicitud va primero y cuál debe esperar. Todo sucede FIFO, primero en entrar, primero en salir.

Los problemas surgen, por ejemplo, cuando tiene que cargar una lista de elementos que tienen una miniatura adjunta. Cuando el usuario se desplaza hacia abajo y espera nuevos resultados, no puede decirle a su actividad que cargue primero el JSON de la página siguiente y solo las imágenes del anterior. Esto puede convertirse en un problema grave de la experiencia del usuario en aplicaciones como Facebook o Twitter, donde la lista de elementos nuevos es más importante que la miniatura asociada a ella.

Volley tiene como objetivo resolver este problema al incluir una poderosa API de cancelación. Ya no es necesario verificar en PostExecute si la actividad fue destruida mientras realizaba la llamada. Esto ayuda a evitar una NullPointerException no deseada.

Es mucho más rápido

Hace algún tiempo, el equipo de Google+ realizó una serie de pruebas de rendimiento en cada uno de los diferentes métodos que puede usar para realizar solicitudes de red en Android. Volley obtuvo una puntuación hasta diez veces mejor que las otras alternativas cuando se usa en aplicaciones RESTful.

Lo almacena todo

Volley enchufa automáticamente las solicitudes y esto es algo que realmente ayuda. Volvamos por un momento al ejemplo que di antes. Tiene una lista de elementos (una matriz JSON, por ejemplo) y cada elemento tiene una descripción y una miniatura asociada. Ahora piense en lo que sucede si el usuario gira la pantalla: la actividad se destruye, la lista se vuelve a descargar y también las imágenes. Para resumir, una pérdida significativa de recursos y una experiencia de usuario deficiente.

Volley demuestra ser extremadamente útil para superar este problema. Recuerda las llamadas anteriores que hizo y maneja la destrucción y reconstrucción de la actividad. Lo guarda todo en caché sin tener que preocuparse por ello.

Pequeñas operaciones de metadatos

Volley es perfecto para llamadas pequeñas, como objetos JSON, porciones de listas, detalles de un elemento seleccionado, etc. Ha sido diseñado para aplicaciones RESTful y en este caso particular da lo mejor de sí.

Sin embargo, no es tan bueno cuando se emplea para operaciones de transmisión y grandes descargas. Contrariamente a la creencia común, el nombre de Volley no proviene del diccionario deportivo. Más bien está pensado como repetidas ráfagas de llamadas, agrupadas. De alguna manera es intuitivo por qué esta biblioteca no es útil cuando, en lugar de una andanada de flechas, quieres disparar una bala de cañón.

2. Debajo del capó

Volley funciona en tres niveles diferentes con cada nivel operando en su propio hilo.

Volley under the hood

Hilo principal

En el hilo principal, de manera consistente con lo que ya hace en la especificación AsyncTask, solo puede disparar la solicitud y manejar su respuesta. Nada más y nada menos.

La consecuencia principal es que puedes ignorar todo lo que estaba sucediendo en el método doInBackground. Volley gestiona automáticamente las transacciones HTTP y los errores de red de captura que necesitabas antes.

Caché y subprocesos de red

Cuando agrega una solicitud a la cola, varias cosas suceden bajo el capó. Primero, Volley comprueba si la solicitud se puede atender desde la memoria caché. Si puede, la respuesta en caché se lee, analiza y entrega. De lo contrario, se pasa al hilo de la red.

En el hilo de la red, un round-robin con una serie de hilos funciona constantemente. El primer subproceso de red disponible dequeues la solicitud, realiza la solicitud HTTP, analiza la respuesta y la escribe en la memoria caché. Para finalizar, envía la respuesta analizada de nuevo al hilo principal donde los oyentes están esperando para manejar el resultado.

3. Comenzando

Paso 1: Importar Volley

Volley no es tan útil para configurarlo. Parece que no hay ningún repositorio oficial de Maven disponible y esto es bastante desconcertante. Debes confiar en el código fuente oficial. Puedes importar Volley de varias maneras.

Lo primero es lo primero, descargue la fuente Volley de su repositorio. Si tiene confianza en hacer esto, este comando Git puede hacer todo el trabajo por usted:

Hasta hace algunas semanas, podías terminar todo usando la línea de comando ant (android update project -p . Y luego ant jar) e importar tu biblioteca JAR en tu proyecto Android Studio con un simple compile files('libs/volley.jar').

Recientemente, Google actualizó Volley al estilo de construcción de Android Studio, lo que hace más difícil crear un JAR independiente. Todavía puede hacerlo, pero solo con versiones anteriores de la biblioteca. Personalmente, lo desanimo a utilizar esta opción, aunque pueda parecer la más rápida.

Debes configurar Volley de la manera clásica, es decir, importando la fuente como un módulo. En Android Studio, con su proyecto abierto, seleccione Archivo > Nuevo módulo y elija Importar proyecto existente. Seleccione el directorio donde acaba de descargar el código fuente y confirme. Aparecerá una carpeta llamada Volley en su estructura de proyecto. Android Studio actualiza automáticamente su archivo settings.gradle para incluir el módulo Volley, por lo que solo necesita agregarlo al proyecto de compile project(':volley') y listo.

Hay una tercera forma. Puede agregar a la sección de dependencia del archivo build.gradle esta línea:

Es una copia espejo del repositorio oficial de Google, regularmente sincronizado y actualizado. Es probablemente la manera más simple y rápida de comenzar. Sin embargo, tenga en cuenta que se trata de un repositorio no oficial de Maven, sin garantías y sin el respaldo de Google.

En mi opinión, aún es mejor invertir unos minutos más importando el código fuente oficial. De esta forma, puede saltar fácilmente a las definiciones e implementaciones originales para que, en caso de duda, siempre pueda confiar en la fuente oficial de Volley, e incluso cambiarla si lo necesita.

Paso 2: usar Volley

Volley funciona principalmente con solo dos clases, RequestQueue y Request. Primero crea una RequestQueue, que gestiona los hilos de trabajo y devuelve los resultados analizados al hilo principal. A continuación, le pasa uno o más objetos Request .

El constructor Request siempre toma como parámetros el tipo de método (GET, POST, etc.), la URL del recurso y los detectores de eventos. Luego, dependiendo del tipo de solicitud, puede solicitar algunas variables más.

En el siguiente ejemplo, creo un objeto RequestQueue invocando uno de los métodos de conveniencia de Volley, Volley.newRequestQueue. Esto configura un objeto RequestQueue, usando valores predeterminados definidos por Volley.

Como puede ver, es increíblemente directo. Usted crea la solicitud y la agrega a la cola de solicitudes. . Y estas listo.

Tenga en cuenta que la sintaxis del oyente es similar a AsyncTask.onPostExecute, simplemente se vuelve onResponse. Esto no es una coincidencia Los desarrolladores que trabajaron en Volley hicieron que la API de la biblioteca fuera tan similar a los métodos AsyncTask. Esto hace que la transición de usar AsyncTask a Volley sea mucho más fácil.

Si tiene que disparar varias solicitudes en varias actividades, debe evitar el uso del enfoque anterior, Volley.newRequestQueue.add. Es mucho mejor instanciar una cola de solicitud compartida y usarla en su proyecto:

Veremos específicamente desarrollar algo como esto en el próximo tutorial de esta serie.

4. Pon tus manos en la masa

Manejo de solicitudes estándar

Volley es útil para implementar tres tipos de solicitudes muy comunes:

  • StringRequest
  • ImageRequest
  • JsonRequest

Cada una de estas clases extiende la clase Result que utilizamos anteriormente. Ya vimos StringRequest en el ejemplo anterior. Veamos en cambio cómo funciona una JsonRequest

Hermosa. ¿No es así? Como puede ver, el tipo de resultado ya está establecido en JSONObject. También puede solicitar un JSONArray si lo desea, utilizando un JsonArrayRequest en lugar de un JsonObjectRequest.

Como antes, el primer parámetro del constructor es el método HTTP para usar. A continuación, proporciona la URL para recuperar el JSON. La tercera variable en el ejemplo anterior es null. Esto está bien, ya que indica que no se publicarán parámetros junto con la solicitud. Finalmente, tiene el oyente para recibir la respuesta JSON y un oyente de error. Puede pasar null si quiere ignorar los errores.

La obtención de imágenes requiere un poco más de trabajo. Hay tres métodos posibles para solicitar una imagen. ImageRequest es el estándar. Muestra la imagen que solicitó en un ImageView común, recuperándolo a través de una URL proporcionada. Todas las operaciones de decodificación y cambio de tamaño que desee que Volley realice se producen en un hilo de trabajo. La segunda opción es la clase ImageLoader, que se puede considerar como un orquestador de un gran número de ImageRequests, por ejemplo, para poblar un ListView con imágenes. La tercera opción es NetworkImageView, que es una especie de sustituto XML para el elemento de diseño de ImageView.

Veamos un ejemplo.

El primer parámetro es la URL de la imagen y el segundo es el oyente para el resultado. El tercer y cuarto parámetros son enteros, maxWidth y maxHeight. Puede establecerlos en 0 para ignorar estos parámetros. Después de eso, ImageRequest le solicita el ScaleType utilizado para calcular el tamaño de imagen necesario y el formato para decodificar el mapa de bits. Sugiero siempre usar Bitmap.Config.ARGB_8888. Finalmente, pasamos un oyente de error.

Tenga en cuenta que Volley automáticamente establece la prioridad de esta solicitud en LOW.

Hacer una solicitud POST

El cambio de una solicitud GET a una solicitud POST es simple. Debe cambiar Request.Method en el constructor de la solicitud y anular el método getParams, devolviendo un Map<String, String> adecuado que contenga los parámetros de la solicitud.

Cancelar una solicitud

Si desea cancelar todas sus solicitudes, agregue el siguiente fragmento de código al método onStop:

De esta forma, no necesita preocuparse por la posibilidad de que el usuario ya haya destruido la actividad cuando se invoca onResponse. Se lanzaría una NullPointerException en tal caso.

Las solicitudes POST y PUT, sin embargo, deben continuar, incluso después de que el usuario cambie las actividades. Podemos lograr esto usando etiquetas. Al construir una solicitud GET, agréguele una etiqueta.

Para cancelar cada solicitud GET pendiente, simplemente agregamos la siguiente línea de código:

De esta forma, solo cancela las solicitudes GET, dejando intactas otras solicitudes. Tenga en cuenta que ahora tiene que manejar manualmente el caso en el que la actividad se destruye prematuramente.

Administrar cookies y solicitar prioridad

Volley no proporciona un método para configurar las cookies de una solicitud ni su prioridad. Probablemente lo hará en el futuro, ya que es una omisión grave. Por el momento, sin embargo, debe extender la clase Request.

Para administrar cookies, puede jugar con los encabezados de la solicitud, anulando el método getHeaders:

Con esta implementación, puede proporcionar directamente la lista de cookies a la solicitud utilizando setCookies.

Para la prioridad, también necesita extender la clase Request, anulando el método getPriority. Así es como se vería la implementación:

Luego, en el hilo principal, invoque esta línea de código para establecer la prioridad de la solicitud:

Puede elegir entre uno de los cuatro estados de prioridad posibles como se muestra a continuación:

Conclusión

En este artículo, miramos cómo funciona la biblioteca de red Volley. Primero vimos por qué y cuándo es mejor usar Volley en lugar de otra solución ya incluida en el SDK de Android. Luego nos sumergimos en los detalles de la biblioteca, mirando su flujo de trabajo y sus tipos de solicitudes compatibles. Finalmente, nos ensuciamos las manos creando solicitudes simples e implementando las personalizadas para manejar las cookies y la priorización.

En la próxima parte de esta serie sobre Volley, crearemos una aplicación simple que aprovecha Volley. Te mostraré cómo hacer una aplicación meteorológica para Marte, utilizando datos meteorológicos recopilados en Marte por el rover Curiosity.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.