0

我需要在 AIR 应用程序中加载任意数量的文件。

我想遍历一个 File 对象数组,并为每个人的 File.url 创建和启动 Loaders。

当它们完成后(事件 COMPLETED 或 IOErrorEvent.IO_ERROR),我想将它们的数据填充到某个地方。如果他们失败了,我想进行异常报告。我找不到从事件侦听器中引用 File 对象的任何方法(当然不是 IO_ERROR)

最好的方法是为每个将文件信息“硬编码”到其中的启动器创建单独的事件处理程序。至少,我可以将函数本身用作字典的索引:

foo(fileToLoad:文件):无效
{
    var theCompletedHandler : 函数 =
    {
        var theFile : File = completedHandlerLookup[?????? 这个功能??????];
        var theData : ImageData =
            new ImageData(theFile.url, (_loader.content as Bitmap).bitmapData);

        // 对数据做一些事情

        删除完成的HandlerLookup[?????? 这个功能??????];
        删除 errorHandlerLookup.findByValue(theFile); // [原文如此]
    }

    var theErrorHandler : 函数 =
    {
        var theFile : File = errorHandlerLookup[?????? 这个功能??????];

        // 报告错误

        删除errorHandlerLookup[?????? 这个功能??????];
        删除完成的HandlerLookup.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(new URLRequest(fileToLoad.url));

我可以使用 event.currentTget 并将 Loader 实例用作索引吗?那会有什么奇怪的依赖吗?

干杯

4

1 回答 1

2

您可以使用 event.currentTarget 作为索引查找,只要您清除所有引用,您应该没有问题。但是请注意,加载程序事件侦听器已添加到 loader.contentLoaderInfo,因此将通过 e.currentTarget.loader 访问加载程序。

另外值得一提的是,针对这种情况的一种更简单的方法是构建一个基于队列的系统,因此它一次只加载一个文件。例如将所有文件存储在一个数组中。然后在 COMPLETE 或 IO_ERROR 上,您将处理当前文件,然后开始下一个文件。这在资源方面会更好(只有一个加载器),并避免垃圾收集问题。

我也有点好奇你为什么是匿名函数?从垃圾收集的角度来看,它们不是很好,实际上使这种情况复杂化。这是要求吗?

编辑:这是基于队列的系统如何解决此问题的粗略(且不完整)示例。

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 回答