Si habéis estado programando para Android desde tiempos inmemoriales (al menos hasta el 2.x), estaríais acostumbrados a utilizar Threads de la forma usual de Java.

Pero si ese código lo compiláis para alguna versión >=3.0, veréis que rompe en tiempo de ejecución con algún mensaje críptico y, la razón de ello, es que se decidió que todo hilo debería hacerse utilizando un sistema diferente: AsyncTask

Utilizar esta clase en nuestros proyectos es muy fácil y no necesitaremos hacer ningún tipo de invocación esotérica.


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");
 }
}

Este ejemplo es que nos ofrece la API de Android para ver el funcionamiento de esta API.

Básicamente tenemos que crear una clase que extienda de AsyncTask e indicarle (si queremos, dado que es posible pasarle Void para indicarle que no lo queremos usar) los siguientes parámetros:

  1. Params. Este es el tipo del parámetro que le enviaremos a la tarea cuando esté a punto de empezar.
  2. Progress. Aquí tendremos una forma de indicar el progreso de una tarea dado que esta es la representación de la unidad incremental de la tarea.
  3. Result. El resultado final.

Si observamos más el ejemplo, vemos que tiene los siguientes métodos:

  1. doInBackground. Este método toma como parámetros los indicados en Params y accede a ellos como si fuera un array. Así mismo devuelve un resultado del tipo Result. Este método es el que se encarga de hacer toda la tarea, así que será siempre el que lleve nuestra lógica
  2. onProgressUpdate. Este método se utiliza para indicar que se está trabajando (por ejemplo una barra de progreso), aunque no tendremos una forma directa de mostrar el tiempo exacto restante.
  3. onPostExecute. Aquí obtendremos el resultado de lo que haya hecho la aplicación.

Pero también tenemos dos métodos extra:

  1. onPreExecute. Método que se llamará antes de empezar con el resto de tareas. Útil para inicializar.
  2. onCancelled. Se le llama cuando se cancela una tarea.

Teniendo todo ésto, ¿cómo lo ejecutamos? Pues fácilmente:


new DownloadFilesTask().execute(url1, url2, url3);

Y por último tenemos una serie de detalles que son interesantes de saber:

  1. Si quieres cancelar una tarea, solamente tienes que invocar al método cancel.
  2. No hay que llamar a los métodos (on…) manualmente
  3. Solo puede haber una tarea de un tiempo en funcionamiento y debe ser llamada desde la UI.

Links

http://developer.android.com/reference/android/os/AsyncTask.html

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>