Flex 3关闭UrlLoader抛出异常
我正在尝试使用UrlLoader模拟’HEAD’方法;本质上,我只想检查文件是否存在而不下载整个文件.我想我只会使用HttpStatusEvent,但是当您在调试模式下运行时,以下代码会抛出异常(我无法在try / catch块中包装).
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()"> <mx:Script> <![CDATA[ private static const BIG_FILE:String = "http://www.archive.org/download/gspmovvideotestIMG0021mov/IMG_0021.mov"; private var _loader:URLLoader; private function init():void { _loader = new URLLoader(); _loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,statusHandler); _loader.addEventListener(IOErrorEvent.IO_ERROR,errorHandler); _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,errorHandler); _loader.load(new URLRequest(BIG_FILE)); } public function unload():void { try { _loader.close(); _loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS,statusHandler); _loader.removeEventListener(IOErrorEvent.IO_ERROR,errorHandler); _loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,errorHandler); } catch(error:Error) { status.text = error.message; } } private function errorHandler(event:Event):void { status.text = "error"; unload(); } private function statusHandler(event:HTTPStatusEvent):void { if(event.status.toString().match(/^2/)) { status.text = "success"; unload(); } else { errorHandler(event); } } ]]> </mx:Script> <mx:Label id="status" /> 我尝试使用ProgressEvents,但似乎有些404页面返回内容,因此状态事件将正确识别页面是否存在. 有人有主意吗? 解决方法
我认为这是URLLoader类中的一个错误.
如果你看到错误信息(至少我得到的那个,你没有粘贴yorrs!)你会看到它:
这可以让您了解正在发生的事情. URLLoader类在内部使用URLStream对象,该对象提供对下载数据的低级访问. 该错误消息表明正在URLLoader上调用onComplete处理程序.该文件很大但它可能已缓存,因此加载速度相当快.现在,如果为进度和完成事件添加侦听器,您将看到触发事件的顺序是: >进步 docs证实了这一点:
现在,您可以看到问题是来自您正在调用close()的状态处理程序.这会关闭流.但显然(我认为这是错误),URLLoader类中的onComplete处理程序不会检查流是否打开. (从Actionscript中无法检查这一点,所以你必须在try / catch中包装代码).您无法从封闭流中读取数据,因此这就是它的原因. 我可以看到两种方法来解决这个问题: 1)推迟执行调用close()(你的卸载方法)的函数,这样在调用URLLoader内部onComplete方法后调用close(). 就是这样: setTimeout(unload,1); 而不是这个: unload(); 2)使用URLStream而不是URLLoader.第一个选项让我觉得有点像一个黑客的解决方法,所以在你的情况下我会选择最后一个.通常,使用URLStream意味着更多的工作,但在这种情况下,您实际上并不感兴趣阅读任何数据,因此它没有太大的区别.另外,您只需在当前代码中更改两行: 这个: private var _loader:URLStream; 还有这个: _loader = new URLStream(); 而且你们都准备好了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |