Timer |
|||||
Archivos necesarios: |
|||||
En este trial veremos cómo hacer que nuestra aplicación realice una tarea cada cierto tiempo. Este tipo de técnicas se utilizan mucho en los videojuegos y en la animación. El Timer se puede utilizar en programas que necesiten animaciones fluidas en las que se muestran varios sprites entre movimientos, para contar el tiempo que tiene un usuario para realizar cierta tarea o para mostrar mensajes importantes que cambien de color para que el usuario los vea sin necesidad de mostrar un diálogo. El archivo contiene dos clases, la primera es un JDrawingPane similar al que hicimos en el trial de dibujar. Esta clase además de contar con el método paint cuenta con una clase privada llamada BallTimerTask que se encarga de cambiar la posicion de la pelota y mandarla dibujar. La otra clase que contiene es la clase Main que únicamente sirve para poner el JDrawingPane e iniciar todo. |
|||||
¿Qué es un Timer? |
|||||
| En los inicios de la computación los genios de la informática se dieron cuenta que los programas perdían mucho tiempo esperando a recibir datos del disco duro. Una de las consecuencias de esto es que los usuarios creían que el programa era lento porque no tenían control sobre este. Para poder resolver este problema se creo un esquema en que los programas son un conjutno de hilos de ejecución que corren al mismo tiempo para que mientras un hilo está leyendo del disco otro hilo pueda dibujar la interfaz gráfica y que el usuario sienta que el programa sigue respondiendo. En Java podemos utilizar un hilo de ejecución para manejar estas y muchas otras cosas. La manera más sencilla de implementar un hilo es mediante un Timer, que es como un reloj que cada que da un tick realiza una acción. | |||||
¿Cómo crear un Timer? |
|||||
![]() |
Crear un Timer es muy sencillo, lo primero que tenemos que hacer es decirle al Timer qué es lo que tiene que hacer. Para decirselo debemos crear una clase que herede TimerTask que tiene un método llamado run() que se va a ejecutar cada que pase un cierto tiempo (cada que haya un tick). Para poder crear la clase que herede a TimerTask debemos crear la clase de la siguiente manera: [public | private] class NOMBRE_DE_CLASE extends TimerTask |
||||
En el constructor de la clase regularmente recibimos al componente con el que va a estar interactuando el TimerTask, en el archivo de ejemplo recibimos un JDrawingPane que es en el que va a estar dibujando el BallTimerTask, esto lo hacemos porque nos permite interactuar más fácilmente, por ejemplo nos permite llamar los métodos del JDrawingPane para mandar a dibujar la pelota. El método run() es el que se encarga de realizar la tarea que se debe realizar cada tick. Aqui es donde calculamos la siguiente posicion en la que se debe dibujar la pelota y la mandamos dibujar. |
|||||
| Una vez que hayamos creado la clase que extiende TimerTask podemos crear un nuevo Timer. Podemos utilizar dos constructores, el primero es el constructor por omisión (como se ve en la fotografía) o también podemos utilizar un constructor que recibe un String, que es el nombre del Timer (este último sólo tiene sentido cuando vamos a utilizar más de un Timer) | ![]() |
||||
Ahora sólo tenemos que llamar el método schedule() que recibe tres parámetros, el primero es el TimerTask que se debe ejecutar cada tick, el segundo es el tiempo de espera antes de que empiece a correr el timer en milisegundos, el tercero es el tiempo entre cada tick en milisegundos. En el ejemplo vamos a pintar una vez cada cincuenta milisegundos o veinte veces por segundo (1 / 0.050), con lo que obtenemos una animación fluida. |
|||||
¿Cómo detener un Timer? |
|||||
![]() |
Ya vimos cómo crear un Timer, pero si queremos que únicamente se ejecute un cierto número de veces y luego se detenga, ¿qué podemos hacer? |
||||
La manera en que esto se maneja es que dentro del método run() revisemos el número de veces que se ha corrido, y en caso de que el número de veces sea igual al número de veces que se debe correr, se termine el Timer mediante una llamada al método cancel(). Nota que si la llamada al método cancel() la haces dentro del mismo método run() el método se va a continuar ejecutando por esa última vez. Es importante recordar que para que el Timer se detenga la variable counter debe ser de acceso global o si no se va a reiniciar cada que se ejecute el método. |
|||||