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

Tareas en segundo plano en Android: típicos errores y clases más utilizadas

Post Series: Tareas en segundo plano en Android (II)

En esta nueva serie de tutoriales sobre tareas en segundo plano en Android abordaremos los siguientes objetivos:

  • Explicar los errores más comunes del uso de la clase AsyncTask.
  • Mostrar los constructores y métodos de las clases Thread, Handler y AsyncTask.
  • Describir las principales características la clase AlarmManager, además de comentar en qué situaciones no se recomienda su uso y cómo se implementaría.
  • Mostrar los métodos y constantes que presenta la clase AlarmManager.
  • Implementar en un ejemplo, la planificación de tareas con la clase AlarmManager, realizando diferentes pruebas con los métodos que implementa dicha clase.

En esta primera publicación veremos los dos primeros puntos: errores comunes clase AsynTask y presentar los constructores y métodos de esas tres clases.

Errores más comunes en el uso de la clase AsyncTask

Hay determinados comportamientos, que provocan un mal funcionamiento de la aplicación al implementar la clase AsyncTask. Veamos algunos de los más destacados:

Giro de pantalla

Al cambiar de posición el dispositivo, y por lo tanto gire la pantalla, se habrá creado una nueva Activity, por lo tanto la referencia establecida en el AsyncTask a la activity será errónea, por lo que al llamar al método OnPostExecute() , no realizará ninguna acción sobre la activity nueva.

Una forma de solventar este problema, es establecer Activity.onRetainNonConfigurationInstance ()  o en el caso de uso de Fragments Fragment.setRetainedInstance (true) para establecer la referencia a AsyncTask.

Ciclo de vida de un AsyncTask

Es necesario que controlemos en todo momento la cancelación de la tarea programada con AsyncTask, ya que independientemente de que la Activity que originó el asyncTask esté destruída, esta seguirá funcionando hasta que se invoque el método AsyncTask.cancel()

Número de tareas con AsyncTask

El número de tareas asíncronas al que está limitado AsyncTask es 128, además de poder establecer en cola 10 más. En el caso de que el número de tareas en segundo plano sea superior a 138, provocará el bloqueo de la aplicación, y por lo tanto el impedimento de realizar cualquier acción. Esto propiciará que al cabo de varios segundos, el propio S.O. Android nos pregunte si deseamos cerrarla o esperar a su finalización, permitiendo en última instancia que el propio S.O. cierre la aplicación para liberar recursos en el sistema.

Principales métodos y constructores de las clases Thread, Handler y AsyncTask

En este punto nos centraremos en los constructores y métodos que implementan las clases Thread, Handler y AsyncTask, centrándonos en aquellos más representativos.

Nota: Utilizaremos el concepto de ‘hilo‘ (thread), para referirnos a la unidad de procesamiento más pequeña planificada por un sistema operativo, cuya principal tarea es la de permitir a las aplicaciones realizar varias tareas simultáneas, mediante el uso de la clase Thread.

Thread

Documentación oficial Thread

Constructores públicos Descripción (Parámetros)
Thread() Construye una instancia de la clase Thread sin un objeto Runnable.
Thread(Runnable runnable) Construye una instancia de la clase Thread utilizando un objeto Runnable.
Thread(Runnable runnable, String threadName) Construye una instancia de la clase Thread utilizando un objeto Runnable y un nombre proporcionado.
Thread(String threadName) Construye una instancia de la clase Thread sin un objeto Runnable y un nombre proporcionado.
Thread(ThreadGroup group, Runnable runnable) Construye una instancia de la clase Thread utilizando la pertenencia a un ThreadGroup y un objeto Runnable.
*Nota: Cualquier hilo o Thread debe formar parte de un grupo de hilos o ThreadGroup. Permite organizar los hilos o Threads en una estructura jerárquica. Google desaconseja su uso.
Thread(ThreadGroup group, Runnable runnable, String threadName) Construye una instancia de la clase Thread utilizando la pertenencia a un ThreadGroup, un objeto Runnable y un nombre proporcionado.
Thread(ThreadGroup group, String threadName) Construye una instancia de la clase Thread utilizando la pertenencia a un ThreadGroup y un nombre proporcionado.
Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) Construye una instancia de la clase Thread utilizando la pertenencia a un ThreadGroup, un objeto Runnable, un nombre proporcionado y el tamaño de la pila.

 

Método Valor que devuelve
activeCount() static int
Devuelve el número de hilos que se están ejecutando en un ThreadGroup.
currentThread() static Thread
Devuelve el hilo que se está ejecutando.
getId() long
Devuelve el identificador del hilo.
getPriority() final int
Devuelve la prioridad del hilo.
isAlive() final boolean
Devuelve verdadero si el receptor se ha iniciado y continúa en ejecución
setPriority(int priority) final void
Establece la prioridad de un hilo.
Define tres valores constantes, que permiten controlar la prioridad del hilo a ejecutar: MIN_PRIORITY, que establece el valor de prioridad mínimo para un hilo, con un valor constante de 1, NORM_PRIORITY, que establece el valor de prioridad normal para un hilo, con un valor constante de 5 y MAX_PRIORITY, que establece el valor máximo de prioridad para un hilo, con un valor constante de 10.
sleep(long time) static void
Permite que el hilo realice una pausa por el tiempo indicado como parámetro (en milisegundos).
start() synchronized void
Inicia un nuevo hilo de ejecución.
yield() static void
Posibilita la llamada a un hilo para obtener el tiempo de ejecución de otro hilo que está listo para iniciarse.

 

Handler

Documentación oficial Handler

Constructores públicos Descripción (Parámetros)
Handler() Constructor por defecto asociado al controlador para el hilo en ejecución.
Handler(Handler.Callback callback) Constructor para hilo en ejecución, recibiendo como parámetro un controlador de devolución de llamada.
Handler(Looper looper) Utiliza como parámetro un Looper proporcionado, en lugar del predeterminado.
Handler(Looper looper, Handler.Callback callback) Utiliza como parámetro un Looper proporcionado, en lugar del predeterminado, además de un controlador de devolución de llamada.

 

Método Valor que devuelve
handleMessage(Message msg) void
La Subclase debe implementar este método para recibir mensajes.
obtainMessage() final Message
Devuelve un nuevo mensaje del conjunto de mensajes.
*Existen varias sobrecargas de este método.
sendMessage(Message msg) final boolean
Coloca un mensaje en el extremo de la cola de estos, después de todos los mensajes pendientes y antes de la hora actual.
sendMessageAtTime(Message msg, long uptimeMillis) boolean
Coloca un mensaje en el extremo de la cola de estos, después de todos los mensajes pendientes y antes del tiempo pasado como parámetro.

AsyncTask

Documentación oficial AsyncTask

Constructores públicos Descripción (Parámetros)
AsyncTask() Crea una nueva tarea asíncrona

 

Método Valor que devuelve
execute(Params… params) final AsyncTask<Params, Progress, Result>
Ejecuta la tarea con los parámetros recibidos.
getStatus() final AsyncTask.Status
Devuelve el estado de la tarea que está en ejecución.
isCancelled() final boolean
Devuelve verdadero si la tarea ha sido cancelada, antes de completarse.

Deja un comentario

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