jueves, 16 de octubre de 2014

Tareas en 2º plano Android (Parte I): Clase AsyncTask

Buenas amigos, en este nuevo tema vamos a ver como manejar hilos en segundo plano en nuestra aplicación por medio de la clase AsyncTask. Esta clase nos permitirá ejecutar acciones en segundo plano como lo hacían en java los threads.


Bien, si eres nuevo en android pero conoces java es posible que te resulte un poco complejo entender el sistema de hilos, ya que es totalmente diferente a como creábamos un hilo en java, pero nada más lejos de la realidad, veréis que, explicando una sencillas reglas y mostrando las diferentes fases por la que pasa un hilo en android, es tan fácil de entender como un hilo en java.

Bueno, las reglas básicas para crear una clase AsyncTask en android son:

  • La clase AsyncTask se debe crear como una clase interna de la clase donde deseamos crear nuestro hilo.
NOTA: No os fijéis en los componentes, solo en que es una clase interna.
  • La clase AsyncTask se instancia en nuestro hilo principal, es decir, fuera del AsyncTask.
  • Para iniciar nuestro AsyncTask, debemos de invocar el método execute() de la propia clase.

Con esto, ya sabemos hacer que nuestra clase AsyncTask se ejecute en 2º plano, ahora vamos a ver las fases por las que pasa nuestro AsyncTask una vez empieza a ejecutarse:

La clase AsyncTask tiene varios métodos que podemos sobreescribir en los que podemos definir:
  • Que hacer antes de iniciar la tarea en 2º plano
  • Que hacer durante la tarea en 2º plano
  • Que hacer después de ejecutar la tarea en segundo plano.
Veamoslos:
  • onPreExecute(): Este método realiza las acciones que le indiquemos antes de iniciar la tarea en 2º plano.
  • doInBackground(Params...): Este método es el método principal de nuestro AsyncTask. Es el encargado de ejecutar nuestro código en 2º plano. Es obligatorio ponerlo, si no lo ponéis, os coses a errores y warning
  • onPostExecute(Result...): Este método realiza las acciones que le indiquemos después de ejecutar la tarea en segundo plano.
  • onCancelled(): Este método cancela nuestro AsyncTask.
  • onProgressUpdate(progres...): Va recogiendo el progreso de nuestro AsyncTask.

Bien, estos métodos no se invocan fuera del AsyncTask, son internos, nosotros para ejecutarlos solo debemos invocar execute() y la propia clase los va ejecutando.

Bueno, una cosa que aún no he comentado es el uso de genéricos en esta clase (Si no estas seguro de lo que son los genéricos te recomiendo dos cosas: 1º visitar este enlace y lo 2º es que estudies más el temario básico de java).

Podéis observar que después de heredar de AsyncTask coloco 3 tipos de genéricos, bien, esto va a ser el tipo de devolución de nuestros métodos (String, Integer, Float....), aunque si pongo Void, le estoy indicando que no quiero tener ningún tipo de retorno, ya sabéis que los métodos tipo void, no retornan nada.
  • El primer genérico nos indica el tipo de devolución que tendrá el método onPostExecute()
  • El segundo genérico nos indica el tipo de devolución que tendrá el método onProgressUpdate()
  • El tercer genérico nos indica el tipo de devolución que tendrá el método doInBackground().
Otra cosa que quiero dejar clara, es los parámetros que tienen algunos métodos de esta clase, por ejemplo, el método doInBackground tiene su argumento formado de la siguiente manera (Void...params), esto quiere decir que acepta cualquier número de valores, desde ninguno hasta los que necesitemos. En caso de de llevar cierto numero de valores, se deberían de cargar como un array:
  • params[0], params[1], etc
A estos métodos se les llama "métodos con argumentos variables" y es algo que deberíais conocer.

Bien amigos, este tema no tiene mucha más historia, si tenéis alguna duda u os atascais en algo, preguntar.

Un saludo.




No hay comentarios:

Publicar un comentario