Google Maps API for FlashでaddChildとremoveChildを繰り返すときはunloadメソッドが必要

()
ハマったのでメモ。


というか、
下記の記事の通りなんだけど。
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=8311&forum=20


ユーザーのマウスクリックイベントに応じて、
Google Mapを使ったコンテンツを表示したり、消したりをしようとしました。

そのとき単純に
表示のときは、
mapContents = new MapContents();
//Google Mapコンテンツをインスタンス化
addChild(mapContents);
非表示の時は
removeChild(mapContents);
mapContents = null;
みたいにしたわけですが、
表示→非表示→表示とすると2回目の表示でエラーが出ちゃいました。
Error: Object not initialized
    at com.google.maps.wrappers::Wrapper$/checkValid()
    at com.google.maps.wrappers::IMapWrapper/addControl()
    at com.google.maps::Map/addControl()
    at MapIndex/createMap()
    at MapIndex/loaderComplete()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.net::URLLoader/onComplete()

これはGoogle Mapの仕様の都合によるもので、
Google Mapコンテンツをメモリから消去する場合は、APIの中に用意されたunloadメソッドを使わなくてはならないようです。

なので、たぶん2回目の表示では、「おいおい、まだ地図は残っているのに更に追加するなよ!」みたいな怒られ方なのかなと思います。


unloadメソッドは例えば、Google Mapコンテンツのクラスファイルに以下のような感じで書きます。

addEventListener( Event.REMOVED_FROM_STAGE, unload ) ; //ステージから消された時イベント実行

private function unload( event:Event = null ):void{
            removeEventListener( Event.REMOVED_FROM_STAGE, unload ) ;//リスナー消去
            _map.unload();
         //地図を親から削除し、アンロードして、地図に関連するメモリを解放
            //_mapはAPIのMapオブジェクトの変数
}

こんなふうにして、
Google Mapコンテンツがステージから消された時、
地図に関するメモリを開放するようにすれば、何度も追加・削除が行えるようになりました。


P.S
ここ2年くらいで、手足につけていたミサンガが計5本切れてます。
最後に残っていた、右足のミサンガがとうとう先週切れました。
何か願いが叶うといいけど、何を願ったのか、もはや4年半くらい前のものなんで覚えてない...。

戦意

© 2012 戦意