Zoals eerder is vermeld, heeft de enige feitelijke functionaliteit die de klasse AlarmClock biedt, betrekking op het instellen en af laten gaan van de wekker. Met de ingebouwde klasse Timer (flash.utils.Timer) kunnen ontwikkelaars code schrijven die na een bepaalde hoeveelheid tijd wordt uitgevoerd. De klasse AlarmClock maakt gebruik van een instantie Timer om te bepalen wanneer de wekker moet afgaan.
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);
}
De in de klasse AlarmClock gedefinieerde Timer-instantie heeft de naam
alarmTimer
. De methode
initClock()
, die vereiste instelbewerkingen uitvoert voor de instantie AlarmClock, doet twee dingen met de variabele
alarmTimer
. Eerst wordt de variabele geïnstantieerd met parameters die de Timer-instantie de opdracht geven om 0 milliseconden te wachten en de wekkergebeurtenis slechts één keer te activeren. Nadat
alarmTimer
is geïnstantieerd, roept de code de methode
addEventListener()
van die variabele aan om aan te geven dat deze naar de gebeurtenis
timer
van die variabele wil luisteren. Een instantie Timer werkt door de gebeurtenis
timer
te verzenden nadat een bepaalde hoeveelheid tijd is verlopen. De klasse AlarmClock moet weten wanneer de gebeurtenis
timer
wordt verzonden voor het laten afgaan van de eigen wekker. Door
addEventListener()
aan te roepen, registreert de code van AlarmClock zichzelf als listener bij
alarmTimer
. De twee parameters geven aan dat de klasse AlarmClock naar de gebeurtenis
timer
wil luisteren (aangegeven door de constante
TimerEvent.TIMER
) en dat bij het plaatsvinden van de gebeurtenis de methode
onAlarm()
van de klasse AlarmClock moet worden aangeroepen als reactie op deze gebeurtenis.
Voor het feitelijke instellen van de wektijd wordt de methode
setAlarm()
van de klasse AlarmClock aangeroepen, zoals hier wordt aangegeven:
/**
* 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;
}
Deze methode doet verschillende dingen, zoals het opslaan van het wekbericht en het maken van een Date-object (
alarmTime
), die het feitelijke moment vertegenwoordigt waarop de wekker moet afgaan. Het belangrijkste in deze code zijn hier de laatste paar regels van de methode, waar de wekker van de variabele
alarmTimer
wordt ingesteld en geactiveerd. Eerst wordt de methode
reset()
aangeroepen, waarbij de timer wordt gestopt en opnieuw wordt ingesteld, voor het geval deze al draait. Vervolgens wordt de huidige tijd (vertegenwoordigd door de variabele
now
) afgetrokken van de waarde van de variabele
alarmTime
, om te bepalen na hoeveel milliseconden de wekker kan afgaan. De gebeurtenis
timer
wordt niet op een absoluut tijdstip door de klasse Timer geactiveerd, zodat dit relatieve tijdsverschil wordt toegewezen aan de eigenschap
delay
van
alarmTimer
. Ten slotte wordt de methode
start()
aangeroepen om de timer daadwerkelijk te starten.
Als de opgegeven hoeveelheid tijd is verlopen, verzendt
alarmTimer
de gebeurtenis
timer
. Aangezien de klasse AlarmClock de methode
onAlarm()
als listener heeft geregistreerd voor die gebeurtenis, wordt bij het plaatsvinden van de gebeurtenis
timer
onAlarm()
aangeroepen.
/**
* 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);
}
Een methode die als gebeurtenislistener is geregistreerd, moet met de juiste handtekening worden gedefinieerd (dat wil zeggen, met de parameters en het retourneringstype die voor de methode gelden). Een methode is een listener voor de gebeurtenis
timer
van de klasse Timer als deze één parameter definieert waarvan het gegevenstype gelijk is aan TimerEvent (flash.events.TimerEvent), een subklasse van de klasse Event. Als de instantie Timer de gebeurtenislisteners aanroept, wordt een instantie TimerEvent als gebeurtenisobject doorgegeven.