Uso de HTTP con AsyncTask

 

En el ejercicio anterior hemos configurado el modo estricto para que nos permita realizar accesos a la red desde el hilo principal. Aunque en la mayoría de los casos la interacción con el servidor es inferior a 2 décimas de segundo, podrían darse algunos casos en que la interacción fuera superior a un segundo (servidores sobrecargados o redes muy lentas). En estos casos, la interfaz de usuario permanecería bloqueada un tiempo excesivo.

En el capítulo 5 hemos aprendido a utilizar la clase AsyncTaskpara resolver estos problemas. El siguiente ejercicio nos muestra cómo puede utilizarse en este caso:

Ejercicio: Búsquedas en Google con HTTP  y AsyncTask

1.    Añade la siguiente clase dentro de MainActivitydel ejercicio anterior:

class BuscarGoogle extends AsyncTask<String, Void, String> {
   private ProgressDialog progreso;

   @Override protected void onPreExecute() {
      progreso = new ProgressDialog(MainActivity.this);
      progreso.setProgressStyle(ProgressDialog.STYLE_SPINNER);
      progreso.setMessage("Accediendo a Google...");
      progreso.setCancelable(false); // false: no muestra botón cancelar
      progreso.show();
   }

   @Override protected String doInBackground(String... palabras) {
      try {
         return resultadosGoogle(palabras[0]);
      } catch (Exception e) {
         cancel(false); //true: interrumpimos hilo, false: dejamos termine
         Log.e("HTTP", e.getMessage(), e);
         return null;
      }
   }

   @Override protected void onPostExecute(String res) {
      progreso.dismiss();
      salida.append(res + "\n");
   }
   
   @Override protected void onCancelled() {
      progreso.dismiss();
      salida.append("Error al conectar\n");
   }
}  

 

Observa como la nueva clase extiende AsyncTask<String, Void, String>. Se han escogido estos tres tipos de datos porque la entrada de la tarea será un String con las palabras que hay que buscar; no se necesita información de progreso y la salida será un String con el número de veces que se encuentran. En el método onPreExecute() se visualiza un ProgressDialog con estilo SPINNER. El método doInBackground() es el único que se ejecuta en un nuevo hilo. En el nos limitamos a llamar al método que habíamos programado en el ejercicio anterior para hacer la consulta. En caso de que se produzca una excepción cancelaremos la tarea, mostraremos el error en el Log y no devolveremos nada. El resto de los métodos se llaman según la tarea haya concluido o haya sido cancelada.

2.    Añade el siguiente método:

public void buscar2(View view){
   String palabras = entrada.getText().toString();
   salida.append(palabras + "--");
   new BuscarGoogle().execute(palabras);
}

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

4.   Verifica que la aplicación funciona correctamente.

 

Preguntas de repaso: El protocolo HTTP