Som tidigare nämnts är den enda funktionaliteten som klassen AlarmClock erbjuder den som rör inställning och utlösning av larmet. Den inbyggda klassen Timer (flash.utils.Timer) erbjuder ett annat sätt för programmerare att definiera kod som ska köras efter en viss tid. Klassen AlarmClock använder en Timer-instans för att bestämma när larmet ska utlösas.
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);
}
Timer-instansen i klassen AlarmClock heter
alarmTimer
.
initClock()
-metoden, som utför nödvändiga inställningar för AlarmClock-instansen, gör två saker med
alarmTimer
-variabeln. Först skapas variabeln med parametrar som instruerar Timer-instansen att vänta 0 millisekunder och att bara utlösa timer-händelsen en gång. Efter att ha skapat
alarmTimer
anropar koden variabelns
addEventListener()
-metod för att ange att den vill lyssna på den variabelns
timer
-händelse. En Timer-instans fungerar så att den skickar sin
timer
-händelse efter att en viss tid har gått. Klassen AlarmClock behöver veta när
timer
-händelsen skickas för att kunna utlösa sitt eget larm. Genom att anropa
addEventListener()
registrerar AlarmClock-koden sig själv som avlyssnare med
alarmTimer
. De två parametrarna indikerar att klassen AlarmClock vill lyssna efter
timer
-händelsen (indikeras av konstanten
TimerEvent.TIMER
) och att klassen AlarmClocks
onAlarm()
-metod anropas som svar på händelsen när den inträffar.
För att verkligen kunna ställa in larmet anropas klassen AlarmClocks
setAlarm()
-metod som i följande:
/**
* 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;
}
Den här metoden gör flera saker, som att lagra larmmeddelandet och att skapa ett datumobjekt (
alarmTime
) som representerar den verkliga tidpunkten när larmet ska utlösas. Det som är mest relevant här är metodens sista rader, som innebär att
alarmTimer
-variabelns timer ställs in och aktiveras. Först anropas dess
reset()
-metod, vilket stoppar timern och återställer den om den redan är igång. Sedan subtraheras den aktuella tiden (som representeras av
now
-variabeln) från
alarmTime
-variabelns värde för att bestämma hur många millisekunder som måste gå innan larmet utlöses. Klassen Timer utlöser inte sin
timer
-händelse som en absolut tid, så det är denna relativa tidsskillnad som tilldelas
delay
-egenskapen för
alarmTimer
. Slutligen anropas
start()
-metoden för att starta timern.
När den angivna tiden har gått, skickar
alarmTimer
timer
-händelsen. Eftersom klassen AlarmClock registrerade sin
onAlarm()
-metod som avlyssnare för den händelsen, och
timer
-händelsen inträffar, anropas
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);
}
En metod som registreras som händelseavlyssnare måste definieras med lämplig signatur (d.v.s. parameteruppsättningen och metodens returtyp). För att vara avlyssnare för klassen Timers
timer
-händelse måste en metod definiera en parameter vars datatyp är TimerEvent (flash.events.TimerEvent), som är en underklass till klassen Event. När Timer-instansen anropar sina händelseavlyssnare, överför den en TimerEvent-instans som händelseobjekt.