Название: El gran libro de programación avanzada con Android
Автор: José Enrique Amaro Soriano
Издательство: Bookwire
Жанр: Математика
Серия: El gran libro de
isbn: 9788426720238
isbn:
Figura 3.3.2. Animación de fotogramas que mantiene la relación de aspecto usando padding.
4. PROCESOS EN BACKGROUND
En Android podemos ejecutar simultáneamente partes de un programa como procesos paralelos. Cada uno de estos procesos se denomina thread, o hilo, y se ejecuta en background con una prioridad determinada bajo el control de un objeto de la clase Thread de Java. Una forma de crear un hilo es definir una clase que extienda a la clase Thread. La nueva clase debe sobrescribir el método run(), que se ejecutará cuando se inicie el hilo. Otra forma de crear un hilo es implementando la interfaz Runnable. En este capítulo veremos algunos ejemplos del uso de hilos (en el libro Android se pueden ver ejemplos alternativos).
Inicialmente, solo hay un hilo asociado a una actividad, el hilo principal, que consiste en una serie de instrucciones o sentencias que se ejecutan secuencialmente. Además, este hilo es el que controla los elementos de la interfaz de usuario (UI) que se muestran en pantalla. En este capítulo veremos también cómo se puede modificar la UI desde otro hilo.
4.1. Uso de Timer y RunOnUiThread
La clase Timer del paquete java.util permite programar tareas que se ejecutan transcurrido un tiempo, de forma única o secuencialmente. Un temporizador es un objeto de tipo Timer. Para programarlo se utilizan los métodos schedule, para realizar una única tarea, o scheduleAtFixedRate, para una serie repetitiva de tareas. Para detener el temporizador, se usa el método cancel. Por ejemplo, para programar una tarea repetitiva, escribiríamos lo siguiente:
Aquí, retraso es el tiempo de espera hasta que se ejecute la acción; periodo, el tiempo de repetición y timerTask es un objeto de una subclase de TimerTask, que contiene las instrucciones a ejecutar a través de su método run.
El método run de TimerTask se ejecuta en background en su propio hilo. Por lo tanto, no podremos modificar la UI (la pantalla), pues los objetos de esta, por ejemplo un TextView, solo se pueden cambiar desde el hilo principal. Para sincronizar con la UI y modificar sus objetos, podemos usar el método runOnUiThread(Runnable), de la clase Activity. Su argumento es un objeto de tipo Runnable cuyo método run se ejecutará en sincronía con el hilo principal y permitirá modificar los objetos View que en él residan.
La siguiente actividad ilustra el uso de Timer combinado con RunOnUiThread para mostrar un cronómetro que avanza cada 100 milisegundos. Usaremos el siguiente layout:
La actividad Temporizador.java se detalla a continuación. Contiene dos clases internas: Tarea, subclase de TimerTask, y CambiaTexto, que implementa a la interfaz Runnable, para modificar el TextView. No es necesario usar invalidate para redibujar la pantalla. En la figura 4.1. se muestra el resultado.
Figura 4.1. Cronómetro con Timer y RunOnUiThread.
4.2. Modificación de la UI con post
Alternativamente al método runOnUiThread de la clase Activity, podemos usar el método post(Runnable) de la clase View. El argumento de post debe definir un método run que se ejecutará en el mismo hilo que la UI. Veamos un ejemplo en el que modificamos ligeramente el programa anterior, sustituyendo runOnUiThread por tv.post. También se ha modificado el texto a escribir. No es necesario usar invalidate para actualizar el TextView. En la figura 4.2. se muestra el resultado.
Figura 4.2. Modificación de la UI con View.post.
4.3. Modificación de la UI con Handler.post
Una tercera forma de modificar la interfaz de usuario consiste en usar un controlador, u objeto de la clase Handler. A este objeto le pasaremos un objeto Runnable mediante el método Handler.post(), que lo añade al hilo principal. En el siguiente ejemplo, que es una variación de los dos anteriores, se explica el modo de hacerlo. El resultado se muestra en la figura 4.3. (ver Android para otros ejemplos del uso de la clase Handler pasándole un mensaje).
Figura 4.3. Modificación de la UI con Handler.
4.4. Métodos combinados para modificar la UI
Los tres métodos anteriores, usando RunOnUiThread(), View.post() y Handler.post(), pueden combinarse como en el siguiente ejemplo, donde abrimos tres hilos, cada uno de los cuales varía el color de un texto de forma aleatoria. Para ello modificamos la clase CambiaTexto de los ejemplos anteriores añadiéndole dos parámetros: el texto a modificar y un número que se utiliza para cambiar las componentes RGB del color mediante un algoritmo. En la figura 4.4. se muestra el resultado.
El layout, definido en el siguiente fichero main.xml, contiene tres TextView.
A continuación se detalla el fichero Java de la actividad CambiaColor.
Figura СКАЧАТЬ