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(",");
}
我正在使用的代码在上面。我无法触发完成事件,也就是说,我的数组永远不会被填充。有人能告诉我为什么吗?
编辑:我做了修改,去掉了所有的弱引用并检查了错误。没有任何错误
多年来我经常遇到这个错误。当某些浏览器(FireFox, Chrome)从缓存而不是网络中检索文件时,加载器将调度PROGRESS事件,但不会调度COMPLETE事件。
尝试清空浏览器缓存,看看下次文件是否正确加载。如果是这样,您可以使用以下两种方法之一:
-
通过在请求URL的末尾添加一个随机字符串来打破缓存
urlr = new URLRequest(path + "?cachebust=" + Math.floor(100000+900000*Math.random()));
这是简单的代码,但有明显的缺点,强制不必要的重新加载。
-
同时监听COMPLETE和PROGRESS事件。在PROGRESS处理程序中,检查bytesLoaded是否与bytestosterone匹配。如果发生,则删除所有处理程序并将其视为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 } }
嗯,看看您提供的代码,似乎您实际上尝试使用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 {}