Según se ha mencionado con anterioridad, la única funcionalidad que la clase AlarmClock ofrece realmente está relacionada con la configuración y activación de la alarma. La clase integrada Timer (flash.utils.Timer) proporciona un mecanismo para que los desarrolladores definan código que se ejecutará tras un periodo de tiempo especificado. La clase AlarmClock utiliza una instancia de Timer para determinar cuándo activar la alarma.
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* The Timer that will be used for the alarm.
*/
public var alarmTimer:Timer;
...
/**
* Instantiates a new AlarmClock of a given size.
*/
public override function initClock(faceSize:Number = 200):void
{
super.initClock(faceSize);
alarmTimer = new Timer(0, 1);
alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm);
}
La instancia de Timer definida en la clase AlarmClock se denomina
alarmTimer
. El método
initClock()
, que lleva a cabo las operaciones de configuración necesarias para la instancia de AlarmClock, realiza dos operaciones con la variable
alarmTimer.
En primer lugar, se crea una instancia de la variable con parámetros que indican a la instancia Timer que debe esperar 0 milisegundos y activar su evento de temporizador solo una vez. Tras crear la instancia de
alarmTimer
, el código llama al método
addEventListener()
de la variable para indicar que desea realizar una detección en el evento
timer
de esa variable. Las instancias de Timer funcionan distribuyendo su evento
timer
una vez transcurrida una cantidad de tiempo especificada. La clase AlarmClock necesitará saber cuándo se distribuye el evento
timer
para activar su propia alarma. Al llamar a
addEventListener()
, el código de AlarmClock se registra como detector con
alarmTimer
. Los dos parámetros indican que la clase AlarmClock desea detectar el evento
timer
(indicado por la constante
TimerEvent.TIMER
) y que, cuando este se produzca, debe llamarse al método
onAlarm()
de la clase AlarmClock como respuesta al evento.
Para establecer la alarma, se llama al método
setAlarm()
de la clase AlarmClock del siguiente modo:
/**
* Sets the time at which the alarm should go off.
* @param hour The hour portion of the alarm time.
* @param minutes The minutes portion of the alarm time.
* @param message The message to display when the alarm goes off.
* @return The time at which the alarm will go off.
*/
public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date
{
this.alarmMessage = message;
var now:Date = new Date();
// Create this time on today's date.
alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes);
// Determine if the specified time has already passed today.
if (alarmTime <= now)
{
alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY);
}
// Stop the alarm timer if it's currently set.
alarmTimer.reset();
// Calculate how many milliseconds should pass before the alarm should
// go off (the difference between the alarm time and now) and set that
// value as the delay for the alarm timer.
alarmTimer.delay = Math.max(1000, alarmTime.time - now.time);
alarmTimer.start();
return alarmTime;
}
Este método realiza varias tareas, entre ellas almacenar el mensaje de alarma y crear un objeto Date (
alarmTime
) que representa el instante de tiempo real en el que debe sonar la alarma. En las últimas líneas del método, el temporizador de la variable
alarmTimer
se define y se activa, lo que resulta de especial relevancia para este análisis. En primer lugar, se llama a su método
reset()
, deteniendo el temporizador y reiniciándolo en caso de que ya se estuviese ejecutando. A continuación, se resta la hora actual (representada por la variable
now
) del valor de la variable
alarmTime
para determinar cuántos milisegundos tienen que transcurrir antes de que suene la alarma. La clase Timer no activa su evento
timer
a una hora absoluta, de manera que es esta diferencia relativa de tiempo la que se asigna a la propiedad
delay
de
alarmTimer
. Finalmente, se llama al método
start()
para iniciar el temporizador.
Una vez que ha transcurrido la cantidad especificada de tiempo,
alarmTimer
distribuye el evento
timer
. Dado que la clase AlarmClock ha registrado su método
onAlarm()
como un detector de ese evento, cuando se produzca el evento
timer
se llamará a
onAlarm()
.
/**
* Called when the timer event is dispatched.
*/
public function onAlarm(event:TimerEvent):void
{
trace("Alarm!");
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
}
Un método que se registra como detector de eventos debe definirse con la firma adecuada (es decir, el conjunto de parámetros y el tipo de devolución del método). Para que un método pueda ser detector del evento
timer
de la clase Timer, debe definir un parámetro cuyo tipo de datos sea TimerEvent (flash.events.TimerEvent), una subclase de la clase Event. Cuando la instancia de Timer llama a sus detectores de eventos, pasa una instancia TimerEvent como objeto de evento.