(+34) 958084455 informacion[arroba]academiaandroid.com

Hilo principal y jerarquía de procesos en Android

Post Series: Hilo principal y tareas en background

Siguiendo con los fundamentos para crear aplicaciones Android vamos a tratar en esta serie de tutoriales la ejecución de tareas en segundo plano (background) en Android. 

Los objetivos que vamos a cubrir en este módulo son:

  • Entender la importancia de los hilos o subprocesos en un sistema operativo.
  • Conocer la lógica de jerarquías de procesos para aplicaciones Android.
  • Conocer las principales características de las clases AsyncTask, Handler, Thread y Runnable que nos permiten implementar tareas en segundo plano.
  • Saber cuando se recomienda el uso de AsyncTask o el uso de Threads.
  • Ver con un proyecto un ejemplo práctico de uso e implementación de tareas en background.

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

Nota: hemos tratado ya las tareas en segundo plano en publicaciones anteriores de Academia Android, y parte de lo que explicaremos en los siguientes tutoriales ya estaba descrito allí.

No obstante, esta serie, que se corresponde con el módulo 4 de nuestro nuevo curso basado en Android Studio, contendrá algunas diferencias en el contenido y la creación de un proyecto ejemplo ampliado, utilizando además la última versión disponible de Android Studio (versión 2.1.2, en el momento de elaborar esta documentación).

Hilo principal (main thread)

Android es un sistema operativo multitarea que permite la ejecución de varias tareas simultáneamente. Esta característica que a simple vista nos puede parecer algo básico, facilita que en muchas ocasiones las aplicaciones actualicen información sin afectar a la respuesta y manejo del dispositivo donde se ejecutan.

Para proporcionar esa funcionalidad, los procesos que se ejecutan han de poder descomponerse en hilos (threads).  Un hilo de ejecución o subproceso es la unidad de procesamiento más pequeña que un sistema operativo puede manejar.

Proceso multihilo

Al desarrollar para Android, debemos tener muy presente la experiencia final del usuario que va a utilizar las aplicaciones que creamos. Toda tarea que necesite de recursos costosos del sistema deberá realizarse en un hilo secundario para evitar que bloquee el hilo principal de la aplicación, y afecte al usuario durante la ejecución de la misma.

Por defecto, todos los componentes de la misma aplicación se ejecutan en el mismo proceso y es por eso que cuando hablamos del hilo principal o main thread, nos referimos al hilo de ejecución donde se ejecutan los componentes, servicios, actividades, etc. de una aplicación Android. Debido a la filosofía de Android respecto al consumo de recursos, el sistema se encarga de monitorizar el hilo principal y cualquier operación que supere los 5 segundos dará lugar a un mensaje de “Application Not Responding“, permitiendo al usuario esperar o forzar el cierre de la aplicación.

Android trata de mantener un proceso de aplicación durante el tiempo que sea necesario, pero necesita liberar recursos de memoria para procesos nuevos o de mayor importancia. Es aquí donde se delimita cada proceso en una “jerarquía de importancia“, basado en los componentes que se ejecutan en el proceso y el estado de los mismos.

Hay cinco niveles en la jerarquía de importancia. La siguiente lista muestra los diferentes tipos de procesos en orden de importancia:

Procesos en primer plano:

Proceso requerido para lo que el usuario está haciendo actualmente. Un proceso se considera que está en el primer plano si se dan cualquiera de las siguientes condiciones:

  • Activity que interactúa con el usuario (el método onResume() de la Activity ha sido llamado).
  • Cuando la Activity con la que interactúa el usuario aloja un Servicio (Service).
  • Cuando un Servicio ha llamado al método startForeground(), y por lo tanto se ejecuta en primer plano.
  • Cuando aloja un Servicio que será llamado durante el ciclo de vida de la aplicación (onCreate(), onStart() u onDestroy()).
  • Cuando aloja un BroadcastReceiver que está ejecutando el método onReceive().

Procesos visibles:

Este tipo de procesos no define ningún componente en primer plano. Un proceso se considera visible:

  • Si se define una Activity que no está en primer plano pero es visible para el usuario (llamada al método onPause() del ciclo de vida de la aplicación).
  • Si se aloja un Servicio destinado a ser invocado en primer plano o a una actividad visible.

Procesos de servicio:

Aquellos procesos que se ejecutan en un Servicio (iniciados con StartService()) y no pasan a las dos categorías superiores.

Procesos en segundo plano:

Proceso que se mantiene en una Activity en segundo plano, y que por lo tanto no es visible para el usuario (ocurre cuando se llama al método onStop() del ciclo de vida de la aplicación).

Procesos vacíos:

Se trata de procesos que no están presentes en los componentes de la aplicación.

Android clasifica a un proceso en el nivel más alto que puede, en base a la importancia de los componentes activos en dicho proceso. Si por ejemplo un proceso recibe un servicio y una actividad visible, el proceso está clasificado como un proceso visible y no como un proceso de servicio.

En la próxima publicación veremos las clases AsyncTask, Handler, Thread y Runnable que nos permiten implementar tareas en segundo plano.


Créditos: parte de estos contenidos están basados en la documentación oficial de Android Developers que están publicados bajo licencia Creative Commons Attribution 2.5.
Imagen de Cburnett publicada con licencia CC-BY-SA-3.0, via Wikimedia Commons

This Post Has One Comment

Deja un comentario

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