2011-08-10 7 views
1

ステージにサムネイルを表示するAS3のクラスを作成しています。AS3のフラッシュイベントホッピングが混乱しています

私は、画像をアップロードしてビットマップにして最終的にステージに置くという一連のイベントを使用していますが、非常に混乱しています。

まず、私はユーザーにいくつかの画像を選択させる。 5枚の画像を言う。

//Turn the image in to a bitmap. 
private function imageLoadHandler(evt:Event):void { 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bitmapLoadHandler); 
    loader.loadBytes(evt.target.data);//security issue 
} 

、最終的には、この:

//have the bitmap configured with width and height and scaling. 
private function bitmapLoadHandler(evt:Event):void { 
    var bmp:Bitmap = Bitmap(evt.target.content); 

    //width, height and scaling 
    bmp.width = THUMBWIDTH; 
    bmp.height = THUMBHEIGHT; 
    bmp.scaleX < bmp.scaleY ? bmp.scaleY = bmp.scaleX : bmp.scaleX = bmp.scaleY; 

    //push the image on to an array 
    bmpArray.push(bmp); 
} 

bmpArrayがグローバル変数である

//Files in an array to use in loop 
var files:Array = imgList.fileList; 
numberFiles = imgList.fileList.length; 

//Have all files be locally encoded 
//for-in loop gives too much headaches 
for(var i:Number = 0; i<numberFiles; i++){ 
    var fileRef:FileReference = files[i]; 
    fileRef.addEventListener(Event.COMPLETE, imageLoadHandler); 
    fileRef.load(); 
} 

imageLoadHandlerがこれを行う:私は、このように、それらをロードします。

これは、元のfor-loopが入る最深のステップです。

//Wait for bmpArray to be filled. 

var arrayIsFull:Boolean = false; 

while(!arrayIsFull) { 
    trace(bmpArray.length); 
    trace(numberFiles); 
    if(bmpArray.length == numberFiles) { 
     arrayIsFull = true; 
    } 
} 

その後bmpArrayが永遠に0のまま:ループが行われた後、私はその後、bmpArrayの長さのトレースを行う場合、それは常に私がこれを行う場合、実際には0が表示されます。同じスクリプトを実行している15秒後に自動的に停止するため、Flashはデバッグを停止します。

ここでは何が起こっていますか?なぜbmpArrayは空のままですか?

プッシュ直後に配列の長さのトレースを作成しました。私はそれがコードのその部分に達し、実際の量に増加するのを見ました。だから、なぜループの後でそれは空ですか?

EDIT:問題の2つの配列がクラスレベルで宣言されています。関数の内部にはありません。スコープは問題ではありません。

public class Pictures extends Sprite { 
... 
private var numberFiles:Number; 
private var bmpArray:Array = new Array(); 
+0

+1素晴らしい、インデントされた&可読なソース(驚くほどまれです)。 – Marty

+0

私は配列にbmpを追加した後にコールするコールバック関数でwhileループを置き換えます。 bitmapLoadHandler()にトレースを書き込んで、呼び出されたかどうかを確認します。 – pkyeck

答えて

0

関数内で宣言されている変数(関数の外から)にはアクセスできません。 variable scopeで確認してください。

+0

bmpArrayはグローバル変数であり、ローカル変数ではありません。 bmpArrayとnumberFilesはどちらも、クラスレベルで定義されており、使用されている関数内では定義されていません。これは私のポストで言及されています。 – KdgDev

+0

私は知らない "どこにあなたが投稿を言及しているか"。私は関数の中で宣言されているグローバルな** var ** @外部にアクセスできないと言っています。 – Benny

+0

関数内で宣言されていません。これはクラスレベルで宣言されています。 – KdgDev

0

非同期タスクを送信した後でビジー状態になることはありますか?あなたはフラッシュがシングルスレッドであることを知っています。ビジー状態の待機がイベントの処理を妨げている可能性がありますか?

なぜハンドラメソッドでトレースを行いませんか?

関連する問題