Vamos a describir cómo configurar los ajustes antes de generar la versión del videojuego Unity que podrá ejecutarse…
Tareas en segundo plano en Android: típicos errores y clases más utilizadas
1.
Tareas en segundo plano en Android: típicos errores y clases más utilizadas
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
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
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. |