Ejecución de 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
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
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
Implementación de las Clases AsyncTask, Thread y Handler
AsyncTask
Clase genérica de la que se debe heredar. Define tres tipos genéricos:
- 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).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private Handler handler = new Handler() { @Override public void handleMessage(Message msg){ } }; [...] handler.sendMessage(handler.obtainMessage()); [...] |
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().
1 2 3 4 5 6 7 8 |
Thread hilo1 = new Thread(new Runnable() { @Override public void run() { //Código a ejecutar } }); hilo1.start(); |
Esta entrada tiene 6 comentarios
Los comentarios están cerrados.
jajajaja que bueno el auto,like
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
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
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.
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
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.