Flex 3关闭UrlLoader抛出异常

时间:2010-05-28 18:41:39

标签: flex actionscript-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页面返回内容,因此状态事件将正确识别页面是否存在。

有人有什么想法吗?

2 个答案:

答案 0 :(得分:6)

我认为这是URLLoader类中的一个错误。

如果你看到错误信息(至少我得到的那个,你没有粘贴yorrs!)你会看到它:

  

错误:错误#2029:此URLStream   对象没有打开流     在flash.net::URLStream/readBytes()     在flash.net::URLLoader/onComplete()

这可以让您了解正在发生的事情。 URLLoader类在内部使用URLStream对象,该对象提供对下载数据的低级访问。

错误消息表明正在URLLoader上调用onComplete处理程序。该文件很大但它可能已缓存,因此加载速度相当快。现在,如果为进度和完成事件添加一个侦听器,您将看到触发事件的顺序是:

  • 进展
  • 状态
  • 完整

docs确认了这一点:

  

请注意httpStatus事件(如果   任何)之前发送(以及另外)   to)任何完整或错误事件。

现在,您可以看到问题是来自您正在调用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(); 

你们都已经准备好了。

答案 1 :(得分:1)

我遇到了类似的问题 我发现的问题是这个电话:

_loader.close();

当我尝试关闭我甚至没有打开的文件时发生错误。因此,在“try”子句中,在尝试关闭文件之前检查文件是否已打开。

迈克