『 TimerEvent.TIMERのdispatcherが分からない(追記あり) 』
2009 年 7 月 22 日Timerクラスを継承したMyTimerクラスを作ってみる。
MyTimerはdispatchEventをオーバーライドしているので、
Timerが発行するイベント(TimerEvent.TIMERとTimerEvent.TIMER_COMPLETE)を検出できるはず・・・だった。
package {
import flash.events.Event;
import flash.utils.Timer;
public class MyTimer extends Timer {
public function MyTimer(delay:Number, repeatCount:int = 0):void {
super(delay, repeatCount);
}
/**
* dispatchEventをオーバーライドする
*/
override public function dispatchEvent(event:Event):Boolean {
trace(event.type);
return super.dispatchEvent(event);
}
}
}
で、下記のテスト用コードを実行してみる。
0.1秒間隔でタイマーを10回繰り返し実行する簡単なもの。
TIMERイベントとTIMER_COMPLETEイベントに対してそれぞれ、timerHandler関数とtimerCompleteHandler関数をaddEventListenerしており、関数内でどのインスタンスからdispatchされたイベントなのか出力するようにした。
var myTimer:MyTimer = new MyTimer(100, 10);
myTimer.addEventListener(TimerEvent.TIMER , timerHandler);
myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
myTimer.start();
function timerHandler(e:TimerEvent):void {
trace(e.target);
}
function timerCompleteHandler(e:TimerEvent):void {
trace(e.target);
}
当然オーバーライドしたdispatchEventを通過したのと同じ数だけきっかり、イベントハンドラが実行されるものだと思っていたのだけれど、実行結果はこうなってしまった。
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
[object MyTimer]
timerComplete
[object MyTimer]
timerHandler関数は実行されているのだけれども、TIMERイベント発行に際してMyTimerクラスのdispatchEventを通過していない様子。どこでイベントが発行されているんだろうか。
一方、TIMER_COMPLETEイベントは期待通り。
うーん、よくわからないです。
教えてえらいひと!
追記 09.07.26
niumさんにコメントもらいました。
可能性 1, Timer が super.dispatchEvent() してる。 可能性 2, 内部で別の EventDispatcher に委譲してる。 Timer のソースが読めないと何ともw
試しに、オーバーライドしたdispatchEvent内の処理を下記のようにしてみました。
override public function dispatchEvent(event:Event):Boolean {
return false;
}
この場合、TIMERイベントは正常に動作しますが、TIMER_COMPLETEイベントは動作しませんでした。確かに、TIMERイベントに関しては別の処理系がdispatchEventをしているようです。