我正在尝试使用 UrlLoader 模拟“HEAD”方法;本质上,我只想检查文件是否存在,而无需下载整个文件。我想我只会使用 HttpStatusEvent,但是当您在 Debug模式下运行时,以下代码会引发异常(我无法将其包装在 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 中)。您无法从关闭的流中读取数据,所以这就是它崩溃的原因。
我可以看到 2 种方法来解决这个问题:
1)推迟执行调用close()的函数(你的unload方法),所以close()是在URLLoader内部的onComplete方法被调用后调用的。
也就是说,这样做:
setTimeout(unload,1);
而不是这个:
unload();
2) 使用 URLStream 而不是 URLLoader。第一个选项让我觉得有点像黑客的解决方法,所以在你的情况下我会选择最后一个。通常,使用 URLStream 意味着您需要做更多的工作,但在这种情况下,您实际上对读取任何数据并不感兴趣,因此没有太大区别。另外,您只需更改当前代码中的两行:
这个:
private var _loader:URLStream;
还有这个:
_loader = new URLStream();
你已经准备好了。
关于apache-flex - Flex 3 关闭 UrlLoader 抛出异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2931642/