いちばん失敗した人決定戦

こんばんは。
ActionScript3で以下の処理を作成しました。

XMLファイルをロード、中身を配列に入れ終わったらタイマーを起動し、
2秒間隔で配列の中身をロード、ロード完了後にtraceで読み込み完了のメッセージを出力
という内容です。

上記の処理を下記に記載して実行した所、2秒間隔で処理は実行されますが、
traceしている"画像読み込み完了"の出力がタイマーを実行するごとに数が増えて表示されます。

1回目のタイマーでは"画像読み込み完了"が一回だけ表示され、
2回目は"画像読み込み完了""画像読み込み完了"と二回表示、
以降回数の分だけ"画像読み込み完了"が出力されます。

なぜこのような動きになるのでしょうか?

とても初歩的な内容だと思いますが、ご教授いただけると幸いです。


↓以下ソース

// タイマー
var slideTimer:Timer=new Timer(2000,0);

// 外部XMLファイルロード
var sample_xml:XML=new XML();
var xmlLength_num:Number;
var xmlLoader:URLLoader = new URLLoader();

var dataArr:Array = new Array();

var largeLoader:Loader = new Loader();

var count:Number = 0;

xmlLoader.addEventListener(Event.COMPLETE, completeXMLHandler);
xmlLoader.load(new URLRequest("xml/file.xml"));
function completeXMLHandler(event:Event) {
var local_xml:XML = new XML(event.target.data);
sample_xml = local_xml;
xmlLength_num = sample_xml.image.length();

for(var i:Number = 0; i < xmlLength_num; i++) {
dataArr.push(sample_xml.data[i]);
}
slideTimer.start();
}


// タイマー処理
slideTimer.addEventListener(TimerEvent.TIMER, slideStart);
function slideStart(event:Event):void {

var largeRequest:URLRequest=new URLRequest(dataArr[count]);
largeLoader.load(largeRequest);
largeLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, dataCompleteHandler);

function dataCompleteHandler(event:Event) {
trace("画像読み込み完了");
count++;
}
}

A 回答 (1件)

まず、解決策から説明しますが、


下記のように関数slideStartと関数dataCompleteHandlerを別に分けて書けば一度のTimerの呼び出しにつき、dataCompleteHandlerは一度しか呼び出されません。
------------------------------------------------------
function slideStart(event:Event):void {
var largeRequest:URLRequest=new URLRequest(dataArr[count]);
largeLoader.load(largeRequest);
largeLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, dataCompleteHandler);
}

function dataCompleteHandler(event:Event) {
trace("画像読み込み完了");
count++;
}
------------------------------------------------------

関数内に関数を書く記述はこういったケースではあまりお勧めはしませんが、どうしてdataCompleteHandlerの呼び出しが重複されていたのか、というと...

------------------------------------------------------
largeLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, dataCompleteHandler);
------------------------------------------------------

上記で行ったイベントリスナーの登録が消えずに残ってしまっているため、slideStart関数が2回目以降に呼び出される時は2重に追加されていきます。読み込み完了後の処理がすべて同一であれば、addEventListenerの定義は一度だけでいいので、slideStart関数の外に書くか、読み込み完了のタイミングでremoveEventListenerを使用して削除しましょう。
    • good
    • 0
この回答へのお礼

おはようございます。
迅速なご回答、またご丁寧にご解説いただきありがとうございます。

昨日は上記の動きが理解できずに悩んでおりましたが、お陰様で解決されました。

お礼日時:2009/09/17 09:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!