スキップしてメイン コンテンツに移動

画面に配置した外部swfの開放 Loader.unloadAndStop

現在製作中のガジェットは、外部のFlashを読み込んで配置します。
外部Flashの埋め込みまでは、すんなりいったのですが、削除に絡んで問題が発生しました。

removeChild( gadget);
gadget.unload();
gadget = null;

以上のコードで画面からは削除されるのですが、以後にに画面をフルスクリーンに切り替えたり、またはフルスクリーンを終了するとエラーを吐いてくれます。

エラーログはフルスクリーンのリサイズでエラーを吐いていたので厄介なのですが、原因は外部swfが正しく開放されないためでした。

外部swfの開放は、内部で設定されているイベントやらまできちっとremoveする必要があるそうです。これはつまり、今回のようなケースではお手上げになります。

ちょっと青ざめましたが、ありがたいことに方法が用意されていました。

ActionScript 3 の Loader.unloadAndStop について(Flash Player 10)
Loader.unloadAndStop は Loader.unload と非常に似通った機能ですが、追加されているステップがあります。「unload」イベントが LoaderInfo クラスに送信されると、Flash Player は可能な限り多くのオブジェクト(Sound、NetStream、EventListener など)の停止と消去を再帰的に試みます。このことにより、unload され停止したオブジェクトがガベージコレクタによって処理される前に CPU を使用することがなくなりました。この機能は、特に未知のサードパーティ製コンテンツを読み込む際に役立ちます。
先ほどのコードを、
gadget.unload(); ⇒ gadget.unloadAndStop( true); に変更すると、見事正常動作しました。

ちなみに、このtrueでガベージコレクションも実行されるとのことです。

これまで私は、FlashPlayer9以上の設定で作成していたので、 これ以降は10以上の設定になりました。(この設定を変えないとコンパイルか実行時にエラーが出ます)現在FlashPlayer9のシェアは数%程度でしょうか?

ゆくゆくはPlashPlyaerのバージョンを判定して、この外部swfの埋め込みをON/OFFさせる必要がありそうです。

追記
こんなことがあった。
http://outcloud.blogspot.com/2010/08/20100818.html
Loader.unloadAndStopをしても完全に削除されないswfもあるようで、そういうガジェットは削除後に画面をフルスクリーンに切り替えるとエラーが出てそれと分かる。(但し、エラーログはリサイズに対して出るので注意。)
そうやって手動で判断するしかないかな。