Skip to content

Ejecución de tareas en segundo plano en Android

Tareas en segundo plano en Android
1. Ejecución de tareas en segundo plano en Android
2. Thread, Handler y AsyncTask ¿cuál elegir?
3. Ejemplo tareas en segundo plano en Android: Aplicación de descarga de ficheros (I)
4. Ejemplo tareas en segundo plano en Android: Aplicación de descarga de ficheros (II)
5. Videotutorial: desarrollo aplicación Android con ejecución de tareas en 2º plano

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().

 


Esta entrada tiene 6 comentarios

  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

  2. Buenas Tardes, he desarrollado una app de temas de recetas y le incluí un temporizador, tipo cuenta atrás, pero debido a que son tiempos superiores a media hora, al minimizarse la app o dejar de estar en primer plano, ya deja de contar. Hay alguna forma práctica de que el proceso siga ejecutándose en background, es decir la cuenta atrás, sin que se pause por perder el foco? Gracias de antemano.

    1. Hola Alexander,
      Sentimos no poder resolverte lo que nos planteas. En esta Web publicamos contenidos para los que prefieren la autoformación, así que los autores que colaboran con nosotros solo elaboran los contenidos (o corrigen posibles errores que se detecten en ellos) pero no dan soporte técnico como tal.
      La ayuda la ofrecemos a través de nuestros cursos, donde contamos con Tutores que resuelven las dudas, o si es alguna cuestión muy particular del alumno, al menos tratan de dar una buena orientación de cómo plantearlo. Las tareas en segundo plano las tratamos en el curso Desarrollo de Aplicaciones para Android (con Android Studio)
      Un saludo

    2. Hola alexander intenta buscar algo relacionado con los servicios en android y BroadCastReceiver , eso te puede ayudar para lo que deseas realizar.
      Pienso con lo respecto al comentario del autor , no es necesario darle soporte como menciones una pequeña pista no le hace daño a nadie .

      Saludos.

Los comentarios están cerrados.

Volver arriba
Esta web usa cookies para su correcto funcionamiento. No hay cookies de publicidad, aunque algunos de los contenidos mostrados (videos o documentos insertados) están alojados en servicios externos (Youtube, Vimeo, Box...) que sí pueden implementar sus propias cookies.    Más información
Privacidad