【问题标题】:URLLoader Event.Complete Not TriggeringURLLoader Event.Complete 未触发
【发布时间】:2013-01-01 11:01:22
【问题描述】:
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(",");
}

我正在使用的代码在上面。我无法触发完成事件,也就是说,我的数组永远不会被填充。谁能告诉我为什么?

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

【问题讨论】:

  • 代码对我来说看起来不错。您是否尝试过处理 IOErrorEvent.IO_ERROR 和 SecurityErrorEvent.SECURITY_ERROR?
  • 是的,我编辑了代码以检查这些错误,但我似乎没有得到它们。我也尝试摆脱所有弱引用,但我仍然没有触发事件。
  • 这不是处理 IOEvent 和 SecurityErrorEvent 的方法。您必须使用 addEventListener 来处理这些事件,就像您使用 COMPLETE 所做的那样。

标签: events actionscript urlloader


【解决方案1】:

嗯,仅查看您提供的代码,您似乎实际上是在尝试使用 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 {}

【讨论】:

  • 我添加了用于安全和 IO 错误的事件侦听器以及它们各自的函数,并带有跟踪以查看它们是否被执行。我仍然没有发现任何错误。
  • 好吧,那么唯一的选择就是运行调试播放器,看看是否有一些“中间错误”。这似乎极不可能,因为您正在加载 txt 文件...
【解决方案2】:

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

尝试清除浏览器缓存,看看下次文件是否正确加载。如果是这样,您可以采取以下两种方法之一作为解决方法:

  1. 通过在请求 URL 的末尾添加一个随机字符串来打破缓存。

    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
        }
    }
    

【讨论】:

  • 即使在地址中添加了随机查询字符串,我也遇到了这个问题。它可能与服务器缓存代理和重复正文数据有关。无论如何,进度变通方法完全有效。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多