Come accennato in precedenza, l'unica funzionalità a cui presiede la classe AlarmClock è l'impostazione e l'attivazione della sveglia. La classe incorporata Timer (flash.utils.Timer) rappresenta per lo sviluppatore un modo per definire il codice che deve essere eseguito una volta trascorsa la quantità di tempo specificata. La classe AlarmClock usa un'istanza di Timer per determinare quando la sveglia deve essere attivata.
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);
}
L'istanza di Timer definita nella classe AlarmClock è denominata
alarmTimer
. Il metodo
initClock()
, che esegue operazioni di configurazione necessarie per l'istanza di AlarmClock, esegue due operazioni con la variabile
alarmTimer
. Innanzi tutto, viene creata un'istanza della variabile con parametri che indicano all'istanza di Timer di attendere 0 millisecondi e di attivare l'evento timer una sola volta. Dopo la creazione dell'istanza di
alarmTimer
, il codice chiama il metodo
addEventListener()
della variabile per indicare che deve ascoltare l'evento
timer
della variabile. Le istanze Timer inviano il proprio evento
timer
una volta trascorsa la quantità di tempo predefinita. Per poter attivare la sveglia, la classe AlarmClock deve sapere quando l'evento
timer
viene inviato. Chiamando
addEventListener()
, il codice AlarmClock si registra come listener in
alarmTimer
. I due parametri indicano che la classe AlarmClock ascolta l'evento
timer
(indicato dalla costante
TimerEvent.TIMER
) e quando l'evento si verifica, il metodo
onAlarm()
della classe AlarmClock deve essere chiamato in risposta all'evento.
Per eseguire l'impostazione della sveglia, viene chiamato il metodo
setAlarm()
della classe AlarmClock nel modo seguente:
/**
* 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;
}
Questo metodo esegue varie attività, compresa la registrazione del messaggio di sveglia e la creazione di un oggetto Date (
alarmTime
) che rappresenta il momento preciso in cui la sveglia si attiva. Di particolare rilevanza per questa discussione sono le ultime righe del metodo, la modalità in cui il timer della variabile
alarmTimer
viene impostato e attivato. Per cominciare, viene chiamato il metodo
reset()
che arresta il timer e lo azzera nel caso fosse già in esecuzione. In seguito, l'ora attuale (rappresentata dalla variabile
now
) viene sottratta dal valore della variabile
alarmTime
per determinare quanti millisecondi devono trascorrere prima che la sveglia si attivi. La classe Timer non attiva il suo evento
timer
a un'ora assoluta, quindi è la differenza oraria relativa che viene assegnata alla proprietà
delay
di
alarmTimer
. Infine, viene chiamato il metodo
start()
per avviare il timer.
Una volta trascorsa la quantità di tempo specificata,
alarmTimer
invia l'evento
timer
. Poiché la classe AlarmClock ha registrato il suo metodo
onAlarm()
come listener di quell'evento, quando si verifica l'evento
timer
, viene chiamato
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 metodo registrato come listener di eventi deve essere definito con l'indicatore appropriato (cioè, l'insieme di parametri e il tipo restituito del metodo). Per poter essere impostato come listener dell'evento
timer
della classe Timer, un metodo deve definire un parametro il cui tipo di dati è TimerEvent (flash.events.TimerEvent), una sottoclasse della classe Event. Quando l'istanza di Timer chiama i propri listener di eventi, passa un'istanza di TimerEvent come oggetto evento.