- Descargar un String con Volley

Para usar esta librería primero has de solicitar el permiso de Internet y añadir en Gradle la siguiente dependencia:

compile 'com.android.volley:volley:1.0.0'

El siguiente paso es crear una cola de peticiones:

RequestQueue colaPeticiones = Volley.newRequestQueue(this);

Existen diferentes clases para crear peticiones. El siguiente nos devuelve el contenido en forma de String:

StringRequest peticion = new StringRequest(
      Request.Method.GET,
      "http://www.google.es/search?hl=es&q=busqueda",
      new Response.Listener<String>() {
         @Override
         public void onResponse(String respuesta) {
            …
         }
      },
      new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {
            …
         }
      }
);

Tiene cuatro parámetros: el método a usar (GET, POST, HEAD, …); la URL y dos escuchadores, uno para una respuesta satisfactoria y otro en caso de error.

Una vez creada la petición, la añadimos a la cola para que se ejecute:

colaPeticiones.add(peticion);

Existen cuatro clases según el tipos de datos a solicitar:

StringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener)

ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight, Config decodeConfig, Response.ErrorListener errorListener)

JsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener)

JsonArrayRequest(String url, Response.Listener<JSONArray> listener, Response.ErrorListener errorListener)

El parámetro method es optativo, de no indicarse se utiliza GET.Los constructores que no disponen de este parámetro utilizan por defecto GET. Las clases JSONObject y JSONArray pertenecen a la librería org.json incluida en el API de Android.

Ejercicio: Acceso HTTP con Volley 

1.    Abre el proyecto HTTP desarrollado en el ejercicio “Utilizando HTTP desde Android”, pero ahora utilizaremos la librería Volley en lugar de la clase HttpURLConnection.

2.   Añade al fichero Gradle Scripts/Bulid.gradle (Module:app) la dependencia:

dependencies {
    …
    compile 'com.android.volley:volley:1.0.0'
}

3.   Necesitamos crear una cola de peticiones. Añade en MainActivity la siguiente variable e iniciacizala en onCreate():

private RequestQueue colaPeticiones;

@Override
public void onCreate(Bundle savedInstanceState) {
    …
    colaPeticiones = Volley.newRequestQueue(this);
}

No resulta recomendable crear una nueva cola cada vez que necesitemos hacer una petición, por eso, vamos a crear una única cola para toda la actividad. Si vas a usar Volley en toda la aplicación puede ser interesante declarar la cola en la clase Application o en un singleton para trabajar con una cola única (descrito en El Gran Libro de Android Avanzado).

4.  En esta clase MainActivityañade el siguiente método:

 void resultadosGoogleVolley(final String palabras) throws Exception {

   StringRequest peticion = new StringRequest(
         Request.Method.GET,
         "http://www.google.es/search?hl=es&q=\""
                      + URLEncoder.encode(palabras, "UTF-8") + "\"",
         new Response.Listener<String>() {
            @Override
            public void onResponse(String respuesta) {
               String resultado = buscaAproximadamente(respuesta);
               salida.append(palabras + "--" + resultado + "\n");
            }
         },
         new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
               salida.append("Error: " + error.getMessage());
            }
         }
   ) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
           Map<String, String> cabeceras = new HashMap<String, String>();
           cabeceras.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1)");
           return cabeceras;
     }
   };
   colaPeticiones.add(peticion);
}

A diferencia de lo realizado en ejercicios anteriores, este método no nos devuelve un Stringcon el resultado, por el contrario, va a modificar directamente la vista salida. Esto se debe a que Volley trabaja siempre de forma asíncrona. Los cuatro parámetros del constructor ya han sido explicados. Recuerda que el servidor de Google solo funcionaba si añadíamos una cabecera User-Agentválida. Para añadir esta cabecera, hemos de sobrescribir el método getHeaders()de la clase.

También puedes sobrescribir getMethod()para cambiar el método o getParams()para añadir parámetros usando el método POST.  

5.   Añade el siguiente método:

public void buscar4(View view){
    String palabras = entrada.getText().toString();
    try {
        resultadosGoogleVolley(palabras);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6.     Abre el layout activity_main.xml y añade un botón con texto: “buscar en Google con Volley” y con un valor para onClick: “buscar4”.

7.     Verifica el funcionamiento de la aplicación.