2011-01-21 26 views
0

私はas3を学んでおり、イベントを理解するのが難しいです。イベントを理解するのに少し役立つ(noob question)

私は後でイメージをロードするためにアクセスする必要がある配列の中にオプションをロードしようとしています。今

..

private function init(e:Event = null):void { 

    removeEventListener(Event.ADDED_TO_STAGE, init); 

    myLoader.load(new URLRequest("slides.xml")); 
    myLoader.addEventListener(Event.COMPLETE, processXMLSlides); 
    ... 
} 

private function processXMLSlides(e:Event):void { 

    removeEventListener(Event.COMPLETE, processXMLSlides); 

    myXML = new XML(e.target.data); 
    myXML.ignoreWhite=true; 

    for (var i:int = 0; i < myXML.IMAGE.length(); i++) { 
     imagesURLs.push(myXML.IMAGE[i]); 
     //trace(myXML.IMAGE[i]); 
    } 
    //Start the main routine. 
    loadImages(); 
    writeImage(imageCurrent); 
} 

loadImagesは()ステージにイメージを書き込むそれらはURLRequestsとして別のアレイの内側のアレイimagesURLsと負荷がかかり、その後writeImage()。

今これはこれです。ここで私はloadImagesを移動した場合()とwriteImage()関数:

private function init(e:Event = null):void { 

     removeEventListener(Event.ADDED_TO_STAGE, init); 

     myLoader.load(new URLRequest("slides.xml")); 
     myLoader.addEventListener(Event.COMPLETE, processXMLSlides); 

      //Start the main routine. 
     loadImages(); 
     writeImage(imageCurrent); 
     ... 
    } 

それは、配列は、XMLから移入される前にloadImagesが呼び出されるので、動作しません。では、as3に、processXMLSlidesが処理を完了するのを待つよう、どうすればいいのですか? 別のイベントが必要ですか?これは愚かですか(私がやっていることをする良い方法がありますか?)

おかげ

+0

注:イベントリスナーをディスパッチャから削除する必要があります。たとえば、myLoader.removeEventListener(Event.COMPLETE、processXMLSlides); evt.target.removeEventListener ...またはevt.currentTarget.removeEventListener ... – TheDarkIn1978

+0

@ TheDarkIn1978なぜそれを言うのですか? eventListenersを削除する必要があるのは、理由がある場合のみであり、必ずしもそうではありません。 –

+0

申し訳ありませんが、わかりませんでした。上記のコードは、myLoaderがイベントリスナーを追加してイベントをディスパッチしているため、誤っていると述べましたが、myLoaderの親が所有していないイベントリスナーを削除しようとしています。また、イベントリスナーは、使用されていない場合は削除する必要があります。そうしないと、ガベージコレクションに関する問題が発生します。 – TheDarkIn1978

答えて

2

あなたの質問は意味がありません、あなたの最初の例は、あなたが求めている正確に何やっている - ロードするXMLを待っています。

Flashイベントは、XMLロードなどの非同期処理の処理に非常に便利です。loadImages();writeImage(imageCurrent);を呼び出す前にどれくらい待っていますか?答えは、XMLがロードされるのと同じくらい長いです。したがって、イベントハンドラメソッドでは、それをどこに保持しますか。

注:

最初のmyLoaderとだけ後でload()メソッドを呼び出すために、リスナーを追加します。ローカル環境(ハードドライブから)でテストすると、「slides.xml」がすぐにロードされ、COMPLETEイベントが発生してからeventListenerがアタッチされます。

+1

ありがとう、私は全体の問題が良く理解しています。 – 0plus1

1

これは未テストコードですが、このようなものが動作するはずです:

private function init(e:Event = null):void 
    { 
    removeEventListener(Event.ADDED_TO_STAGE, init); 

    myLoader.addEventListener(Event.COMPLETE, processXMLSlides); 
    myLoader.load(new URLRequest("slides.xml")); 
    } 

private function processXMLSlides(e:Event):void 
    { 
    e.currentTarget.removeEventListener(Event.COMPLETE, processXMLSlides); 

    myXML = new XML(e.target.data); 
    myXML.ignoreWhite = true; 

    for each (var element:XML in myXML..IMAGE) 
       { 
       var imageLoader:Loader = new Loader(); 
       imageLoader.addEventListener(Event.COMPLETE, writeImage); 
       imageLoader.load(new URLRequest(element)); 
       } 
    } 

private function writeImage(e:Event):void 
    { 
    e.currentTarget.removeEventListener(Event.COMPLETE, writeImage); 
    addChild(evt.currentTarget); 
    } 

あなたはVAR私に固執することがあります:あなたは、各の配置を配置するためにそれを使用することができますように、しかし、forループがuintあなたのイメージの。

は、Loaderクラスの読みを持っています。特定のニーズに合わせて使用​​できるクラス固有のイベントについては、多くの例があります。

関連する問題