informacion[arroba]academiaandroid.com +34 958084455
Post Series: Tareas en segundo plano en Android

En esta serie de tutoriales sobre la ejecución de tareas en segundo plano (background) en Android, vamos a explicar los siguientes puntos:

  • Definición de las clases AsyncTask, Handler y Thread.
  • Implementación de sus clases y métodos más representativos.
  • Cuáles son sus principales características.
  • Cuando se recomienda el uso de AsyncTask y cuando el uso de Threads.
  • Ejercicio práctico con la implementación de las tres clases comentadas.

En esta primera publicación nos cetraremos en los 2 primeros puntos.

Definiciones clases AsynTask, Handler y Thread

Antes de describir estas clases, vamos a poner en situación la importancia del uso de cada una de ellas.

Cualquier componente de Android, como puede ser una Activity, se ejecuta en el hilo principal o main thread (UIThread). Si bien es cierto, que para operaciones rápidas no se encontrará ningún problema, es probable que necesitemos realizar procesos más costosos, y por lo tanto el hilo principal, encargado de mostrar la interfaz de usuario, quedaría bloqueado, con la consiguiente lentitud de cara al usuario. Es aquí donde interviene el S.O. Android, monitorizando todos los procesos que están en ejecución, y forzando a salir de la aplicación para aquellos que superen los 5 segundos.

Para evitar este tipo de situaciones, Android proporciona una serie de clases, que permiten trabajar en segundo plano, para aquellas operaciones que necesiten un mayor tiempo para ser procesadas.

AsyncTask: clase que permite comunicarse con el subproceso del hilo de interfaz de usuario o hilo principal. Para ello realiza operaciones en segundo plano, mostrando los resultados en subprocesos de la interfaz de usuario.
Añadida a partir de la API nivel 3, puedes consultar la documentación oficial de la clase AsyncTask
AsynTask
Thread: clase que proporciona su propia unidad concurrente de ejecución, y se puede definir como la unidad de procesamiento más pequeña que puede ser planificada por un sistema operativo. Una de sus principales características es permitir a una aplicación realizar varias tareas de manera simultánea. Define sus propios argumentos, variables y pila de llamada a métodos.

Formas de ejecutar un hilo:

  • Heredando (extends) de la clase base Thread y creando una instancia de dicha clase.
  • Implementando (implements) la interfaz Runnable, y creando una instancia de la clase que implementa dicha interfaz. Esta opción es muy útil cuando no es posible heredar de la clase base Thread.
  • Nota: Ambas formas deben realizar la llamada al método start(), para procesar el código situado en el método run().

Añadida a partir de la API nivel 1, puedes encontrar aquí la documentación oficial de la clase Thread

 

Ciclo vida de un Thread
Handler: es aquella que permite manejar y procesar mensajes, proporcionando un mecanismo para su envío (a modo de puente) entre threads o hilos, y así poder enviar mensajes desde nuestro hilo secundario al UIThread o hilo principal.
Añadida a partir de la API nivel 1, puedes consultar aquí la documentación oficial de la clase Handler

Thread y Handler

Implementación de las Clases AsyncTask, Thread y Handler

AsyncTask
Clase genérica de la que se debe heredar. Define tres tipos genéricos:

public class TareaAsyncTask extends AsyncTask<params, progress, result>{
  • Params: Tipo de parámetro que se recibirá como entrada para la tarea en el método doInBackground(Params).
  • Progress: Parámetros para actualizar el hilo principal o UIThread.
  • Result: Es el resultado devuelto por el procesamiento en segundo plano.
  • OnPreExecute(): Método llamado antes de iniciar el procesamiento en segundo plano.
  • doInBackground(Params...): En este método se define el código que se ejecutará en segundo plano. Recibe como parámetros los declarados al llamar al método execute(Params).
  • OnProgressUpdate(Progress...): Este método es llamado por publishProgress(), dentro de doInBackground(Params) (su uso es muy común para por ejemplo actualizar el porcentaje de un componente ProgressBar).
  • onPostExecute(Result...): Este método es llamado tras finalizar doInBackground(Params). Recibe como parámetro el resultado devuelto por doInBackground(Params).
  • OnCancelled(): Se ejecutará cuando se cancele la ejecución de la tarea antes de su finalización normal.

Handler
Se instancia la clase Handler, para posteriormente llamar al método sendMessage(), encargado de avisar al UIThread para realizar las tareas de repintado incluidas en el método handleMessage(Message msg).

Thread
Se instancia la clase Thread, posteriormente se implementa el método run(), dónde se definirá el código a ejecutar cuando la instancia creada llame al método start().

 


This Post Has 3 Comments

  1. necesito ayuda con ejecutar una aplicacion en segundo plano …ejemplo cada ves que se reinicio o se apague el dispositivo se inicie la aplicacion ya he intentado varios metodos pero no funcionan

    1. Hola Yosvani, más bien parece que necesites programar un arranque automático de la aplicación que una tarea en segundo plano.
      Sobre este tema no tenemos nada publicado pero lo anotamos para ver si lo podemos tratar más adelante en alguna publicación (aunque quizás puedas encontrar alguna pista buscando en Internet).
      Para más ayuda, podríamos ofrecértela a través de nuestro curso Desarrollo de Aplicaciones para Android (con Android Studio), donde sí contamos con un Tutor que os puede resolver este tipo de dudas, o si es un requerimiento muy particular de vuestro entorno, al menos daros una buena orientación de cómo plantearlo.
      Saludos

Deja un comentario

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

Para evitar robots, por favor completa esta sencilla operación *