『 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をしているようです。

« 
» 

Leave a Reply