URLLoader Event.Complete Not Triggering

时间:2013-01-17 19:52:16

标签: events actionscript urlloader

private var csv:URLLoader = new URLLoader();
private var array:Array = new Array();
private var urlr:URLRequest = new URLRequest();
public function loadRecipe(path:String):void
{
    try
    {
        csv.dataFormat = URLLoaderDataFormat.TEXT;
        urlr = new URLRequest(path);
        csv.addEventListener(Event.COMPLETE, finishRecipe);     
        csv.load(urlr);
    }
    catch (e:SecurityErrorEvent)
    {
        trace("1");
    }
    catch (e:IOErrorEvent)
    {
        trace("2");
    }
}

public function finishRecipe(e:Event):void
{
    var csvString:String = csv.data as String;
    array = csvString.split(",");
}

我正在使用的代码就在上面。我无法触发完成事件,也就是说,我的数组永远不会被填充。任何人都可以告诉我原因吗?

编辑: 我改变了摆脱所有弱引用并检查错误。我没有任何错误。

2 个答案:

答案 0 :(得分:2)

多年来,我经常遇到这个错误。当某些浏览器(FireFox,Chrome)从缓存而不是网络中检索文件时,加载程序将调度PROGRESS事件但从不完成。

尝试清除浏览器缓存,然后查看该文件下次是否正确加载。如果是这样,您可以执行以下两种操作之一:

  1. 通过在请求网址末尾添加随机字符串来中断缓存。

    urlr = new URLRequest(path + "?cachebust=" + Math.floor(100000+900000*Math.random()));
    

    这很容易编码,但有明显的缺点,导致不必要的重新加载。

  2. 侦听COMPLETE和PROGRESS事件。在PROGRESS处理程序中,检查bytesLoaded是否与bytesTotal匹配。如果是,请删除所有处理程序并继续,就好像它是一个COMPLETE事件。

    ... somewhere in your code ...
        loader.addEventListener(Event.COMPLETE, handleComplete);
        loader.addEventListener(ProgressEvent.PROGRESS, handleProgress);
    
    ... somewhere else
    private function handleProgress(evt:ProgressEvent):void
    {
        checkLoadComplete();
    }
    private function handleComplete(evt:Event):void
    {
        checkLoadComplete();
    }
    private function checkLoadComplete():void
    {
        if(loader.bytesTotal > 0 && loader.bytesLoaded == loader.bytesTotal) {
            loader.removeEventListener(Event.COMPLETE, handleComplete);
            loader.removeEventListener(ProgressEvent.PROGRESS, handleProgress);
    
            ... your code here
        }
    }
    

答案 1 :(得分:0)

嗯,只是看看你提供的代码,看起来你真的试图用try / catch来捕获错误。为了找到错误,您必须在实际的加载器上开始监听它们。像这样:

public function Foobar() {
    var loader:URLLoader;
    loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
    loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
    loader.addEventListener(ProgressEvent.PROGRESS, onProgress);
    loader.addEventListener(Event.COMPLETE, onComplete);
}

private function onComplete(e:Event):void {}
private function onProgress(e:ProgressEvent):void {}
private function onSecurityError(e:SecurityErrorEvent):void {}
private function onIOError(e:IOErrorEvent):void {}