Volley es una biblioteca HTTP que hace que la creación de redes sea muy fácil y rápida para las aplicaciones de Android. Fue desarrollado por Google y presentado durante Google I/O 2013. Fue desarrollado debido a la ausencia en el SDK de Android de una clase de red capaz de funcionar sin interferir con la experiencia del usuario. Aunque Volley es parte del Proyecto de código abierto de Android (AOSP), Google anunció en enero de 2017 que Volley se trasladará a una biblioteca independiente. Administra el procesamiento y el almacenamiento en caché de las requests de red y ahorra a los desarrolladores un tiempo valioso al escribir el mismo código de llamada/caché de red una y otra vez. Volley no es adecuado para grandes operaciones de descarga o transmisión, ya que Volley mantiene todas las respuestas en la memoria durante el análisis. Características de Volley:
- Solicitud de cola y priorización
- Gestión eficaz de memoria y caché de requests
- Extensibilidad y personalización de la biblioteca a nuestras necesidades
- Cancelando las requests
Ventajas de usar Volley
- Todas las tareas que deben realizarse con Networking en Android se pueden realizar con la ayuda de Volley.
- Programación automática de requests de red.
- Atrapando
- Múltiples conexiones de red simultáneas.
- Cancelando API de solicitud.
- Priorización de requests.
- Volley proporciona herramientas de depuración y rastreo.
Cómo importar Volley y agregar permisos
Antes de comenzar con Volley, es necesario importar Volley y agregar permisos en el Proyecto Android. Los pasos para hacerlo son los siguientes:
Crear un nuevo proyecto. Abra build.gradle (Módulo: aplicación) y agregue la siguiente dependencia:
dependencies{ //... implementation 'com.android.volley:volley:1.0.0' }
En AndroidManifest.xml agregue el permiso de Internet:
<uses-permission android:name="android.permission.INTERNET" />
Clases en Volley Biblioteca
Volley tiene dos clases principales:
- Cola de requests: Es el interés que se utiliza para enviar requests a la red. Se puede hacer una cola de solicitud a pedido si es necesario, pero generalmente se crea temprano, en el momento del inicio, y se mantiene y se usa como Singleton.
- Solicitud: toda la información necesaria para realizar llamadas a la API web se almacena en él. Es la base para crear requests de red (GET, POST).
Tipos de solicitud usando Volley Library
Solicitud de string
Java
String url = "https:// string_url/"; StringRequest stringRequest = new StringRequest( Request.Method.GET, url, new Response.Listener() { @Override public void onResponse(String response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); requestQueue.add(stringRequest); </pre>
Solicitud de objeto JSON
Java
String url = "https:// json_url/"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); requestQueue.add(jsonObjectRequest);
Solicitud de array JSON
Java
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest( Request.Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONArray response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); requestQueue.add(jsonArrayRequest);
Solicitud de imagen
Java
int max - width = ...; int max_height = ...; String URL = "http:// image_url.png"; ImageRequest imageRequest = new ImageRequest(URL, new Response.Listener() { @Override public void onResponse(Bitmap response) { // Assign the response // to an ImageView ImageView imageView = (ImageView) findViewById( R.id.imageView); imageView.setImageBitmap(response); } }, max_width, max_height, null); requestQueue.add(imageRequest);
Agregar parámetros de publicación
Java
String tag_json_obj = "json_obj_req"; String url = "https:// api.xyz.info/volley/person_object.json"; ProgressDialog pDialog = new ProgressDialog(this); pDialog.setMessage("Loading...PLease wait"); pDialog.show(); JsonObjectRequest jsonObjReq = new JsonObjectRequest( Method.POST, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); pDialog.hide(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); pDialog.hide(); } }) { @Override protected Map getParams() { Map params = new HashMap(); params.put("name", "Androidhive"); params.put("email", "abc@androidhive.info"); params.put("password", "password123"); return params; } }; AppController.getInstance() .addToRequestQueue(jsonObjReq, tag_json_obj);
Adición de encabezados de solicitud
Java
String tag_json_obj = "json_obj_req"; String url = "https:// api.androidhive.info/volley/person_object.json"; ProgressDialog pDialog = new ProgressDialog(this); pDialog.setMessage("Loading..."); pDialog.show(); JsonObjectRequest jsonObjReq = new JsonObjectRequest( Method.POST, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); pDialog.hide(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); pDialog.hide(); } }) { @Override public Map getHeaders() throws AuthFailureError { HashMap headers = new HashMap(); headers.put("Content-Type", "application/json"); headers.put("apiKey", "xxxxxxxxxxxxxxx"); return headers; } }; AppController.getInstance() .addToRequestQueue(jsonObjReq, tag_json_obj);
Manejo de la caché Volley
Java
// Loading request from cache Cache cache = AppController.getInstance() .getRequestQueue() .getCache(); Entry entry = cache.get(url); if (entry != null) { try { String data = new String(entry.data, "UTF-8"); // handle data, like converting it // to xml, json, bitmap etc., } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } else { // If cached response doesn't exists } // Invalidate cache AppController.getInstance() .getRequestQueue() .getCache() .invalidate(url, true); // Turning off cache // String request StringRequest stringReq = new StringRequest(....); // disable cache stringReq.setShouldCache(false); // Deleting cache for particular cache</strong> AppController.getInstance() .getRequestQueue() .getCache() .remove(url); // Deleting all the cache AppController.getInstance() .getRequestQueue() .getCache() .clear(url);
Solicitud de cancelación
Java
// Cancel single request String tag_json_arry = "json_req"; ApplicationController.getInstance() .getRequestQueue() .cancelAll("feed_request"); // Cancel all request ApplicationController.getInstance() .getRequestQueue() .cancelAll();
Priorización de requests
Java
private Priority priority = Priority.HIGH; StringRequest strReq = new StringRequest( Method.GET, Const.URL_STRING_REQ, new Response .Listener() { @Override public void onResponse(String response) { Log.d(TAG, response.toString()); msgResponse.setText(response.toString()); hideProgressDialog(); } }, new Response .ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); hideProgressDialog(); } }) { @Override public Priority getPriority() { return priority; } };