0

AIR アプリにロードする必要がある任意の数のファイルがあります。

File オブジェクトの配列を反復処理し、それぞれの File.url のローダーを作成して起動したいと考えています。

それらが完了したら (イベント COMPLETED または IOErrorEvent.IO_ERROR)、データをどこかに詰め込みたいと思います。失敗した場合は、例外レポートを作成したいと思います。イベントリスナーから File オブジェクトを参照する方法が見つかりません (確かに IO_ERROR ではありません)。

最善の方法は、ファイル情報が「ハードコーディング」されたランチャーごとに個別のイベント ハンドラーを作成することです。少なくとも、関数自体を Dictionary へのインデックスとして使用できます。

foo(fileToLoad : ファイル) : void
{
    var theCompletedHandler : 関数 =
    {
        var theFile : ファイル = completedHandlerLookup[?????? この関数??????];
        var theData : ImageData =
            new ImageData(theFile.url, (_loader.content as Bitmap).bitmapData);

        // データで何かをする

        完了したHandlerLookup[??????を削除します。この関数??????];
        errorHandlerLookup.findByValue(theFile) を削除します。// [原文のまま]
    }

    var theErrorHandler : 関数 =
    {
        var theFile : ファイル = errorHandlerLookup[?????? この関数??????];

        // エラーを報告する

        errorHandlerLookup[?????? を削除します。この関数??????];
        completedHandlerLookup.findByValue(theFile) を削除します。// [原文のまま]
    }

    completedHandlerLookup[theCompletedHandler] = theCompletedHandler;
    errorHandlerLookup[theCompletedHandler] = theErrorHandler;

    var theLoader : Loader = new Loader();
    theLoader.addEventListener(Event.COMPLETE, theCompletedHandler);
    theLoader.addEventListener(IOErrorEvent.IO_ERROR, theErrorHandler);
    theLoader.load(新しい URLRequest(fileToLoad.url));

event.currentTaget を使用して、Loader インスタンスをインデックスとして使用できますか? それには奇妙な依存関係がありますか?

乾杯

4

1 に答える 1

2

問題がないはずのすべての参照をクリアする限り、event.currentTarget をインデックス ルックアップとして使用できます。ただし、ローダー イベント リスナーが loader.contentLoaderInfo に追加されるため、ローダーは e.currentTarget.loader を介してアクセスされることに注意してください。

また、言及する価値があるのは、この状況に対するより簡単なアプローチは、キューベースのシステムを構築することであり、一度に 1 つのファイルのみをロードすることです。たとえば、すべてのファイルを配列に格納します。次に COMPLETE または IO_ERROR で、現在のファイルを処理してから次のファイルを開始します。これにより、リソースの点で (ローダーが 1 つだけ) かなり良くなり、ガベージ コレクションの問題が回避されます。

また、なぜあなたが匿名関数なのか少し興味がありますか? それらはガベージ コレクションの観点からはあまり良くなく、実際にこの状況を複雑にします。それは要件ですか?

編集:これは、キューベースのシステムがこの問題を解決する方法の大まかな(そして不完全な)例です。

var loader:Loader;
var queue:Array;

function addFile(file:File):void
{
     queue.push(file);
}

function handleLoadedAsset(e:Event):void 
{
    var currentFile:File= queue[0];
    //do whatever
    stepQueueForward();
}

function handleFailedAssetLoad(e:IOErrorEvent):void 
{
    var currentFile:File = queue[0];
    //clean up
    stepQueueForward();
}

function stepQueueForward():void
{
    queue.splice(0, 1);
    var nextFile:File = queue[0];
    loader.load(new URLRequest(nextFile.url));
}
于 2009-05-12T16:25:17.300 に答える