Flash で、Sigleton + MovieClip + ストリーミング表示 でハマる

onEnterFrame で定期的にメッセージを取得する EventDispatcher。まぁ、extends MovieClip で onEnterFrame でゴニョゴニョ書いてもいいんですけど、せっかくなのでこんな感じにしてみました。

import mx.events.EventDispatcher;/** * onEnterFrame のイベントを発生させる *  */class  com.layer13.FrameRefreshMessanger extends EventDispatcher {	public static var ON_ENTER_FRAME_EVENT:String = "onEnterFrame";				// onEnterFrame の String	private static var messanger:FrameRefreshMessanger = new FrameRefreshMessanger();		// singleton用	private var mc:MovieClip;	// onEnterFrame を生成するMovieClip		private static var MESSANGER_MC_NAME:String = "__framerefreshmessanger_mc__";	//生成するMovieClipの名前		/**	 * コンストラクタ	 * 	 */	private function FrameRefreshMessanger() {		super();		this.createMovieClip();	}		/**	 * インスタンスを返す	 * 	 */	public static function getInstance():FrameRefreshMessanger {		return messanger;	}			/**	 * メッセージを送信する	 * 	 */	private function sendMsg():Void {		var o:Object = new Object();		o.type = ON_ENTER_FRAME_EVENT;		o.target = this;				this.dispatchEvent( o );	}		/**	 * onEnterFrame を受け取る MC を作る	 */	public function createMovieClip():Void {		if(_root.__framerefreshmessanger_mc__ == undefined) {			this.mc = _root.createEmptyMovieClip(MESSANGER_MC_NAME,  _root.getNextHighestDepth());		}else {			this.mc = _root[MESSANGER_MC_NAME];		}				this.mc.owner = this;		this.mc.onEnterFrame = function() {			this.owner.sendMsg();		}	}	}

通常はこんな感じで使っています。ムービークリップではないクラスで、ローディングのチェックする時や、再生位置の更新のメッセージを送る時に使っています。

function testFunction() {    trace("hogehoge")}import com.layer13.FrameRefreshMessanger;var msg:FrameRefreshMessanger = FrameRefreshMessanger.getInstance();msg.addEventListener(FrameRefreshMessanger.ON_ENTER_FRAME_EVENT, testFunction);

通常のプレビューは問題無いのですが、ストリーミング表示をすると、なぜかメッセージが送信されなくなってしまいました。なーーんでかと思ったら、ストリーミング表示を開始したときに、FrameRefreshMessanger は消えないのに MovieClip は消えてしまう。かつ、FrameRefreshMessanger のクラスが初期化されない。 からのようです。しーかたがないので、 createMovieClip メソッドを public にして、1フレーム目で叩くようにしたら解消しました。

ちゃんとオブジェクトも2度目に再生するときには消してほし〜(涙

絶対、もっといい方法あるよな〜とか書いてて思った。