Android: Cancelar AsyncTask mientras se ejecuta

Un “AsyncTask” o tarea asíncrona es una clase de android que permite realizar operaciones en segundo plano, se recomienda únicamente para tareas que duran unos pocos segundos, como descargar una lista de datos almacenados en un servidor y cargarlos en un listView. Puede que cuando realicemos una tarea asíncrona nos interese cancelarla por cualquier motivo o dejar que la cancele el usuario, por ejemplo mediante un botón. Antes de explicar como cancelar un AsyncTask hay que tener claros algunos conceptos como la estructura y la manera en que se ejecuta, para ello podéis hechar un vistazo a la siguiente página de Android Developers. Una vez estéis familiarizados con la clase procedemos a ver como podemos cancelar la AsyncTask una vez lanzada:

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

Vemos que en la función doInBackground que es la encargada de realizar las tareas en segundo plano, hay un condicional que analiza si la tarea ha sido cancelada, y si es así sale de la tarea. Para que el condicional devuelva true y cancele la tarea se utiliza el método cancel pasándole un booleano (true o false).

// Instancia
miTarea = new DownloadFilesTask(url, 5, 20000);
// Llamada ejecución
miTarea.execute();
// Un dialog que mostramos en el método onPreExecute() del AsyncTask, le implementamos un botón para que el usuario pueda cancelar la tarea.
miDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
          public void onCancel(DialogInterface dialog) {
              // Cancelamos la tarea y cerramos el dialog
              miTarea.cancel(true);
              dialog.dismiss();
          }
    });

¡ATENCIÓN! La creación del dialog no se realiza, solo se muestra la implementación del botón y su función.
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s