我有一个应用程序,它正在下载几个大的二进制文件并将它们保存到磁盘上。在某些机器上,它运行良好,而在其他一些机器上,每隔一段时间就会有99.9%的下载完成,URLStream对象不会触发Event.complete
这几乎与此处出现的问题相同:
为什么URLStream完成事件在文件加载未完成时被调度?
我试过使用其中一个答案中描述的"缓存半身像"方法,但仍然没有骰子。
如有任何帮助,我们将不胜感激。
这里有一些示例代码来帮助说明我正在尝试做什么:
var contentURL:String = "http://some-large-binary-file-in-amazon-s3.tar";
var stream:URLStream = new URLStream();
stream.addEventListener(Event.COMPLETE, function(e:Event):void{
//This should fire when the file is done downloading
//On some systems this fails to fire once in a while
//On other systems it never fails to fire
});
stream.addEventListener(ProgressEvent.PROGRESS, function(pe:ProgressEvent):void{
//Write the bytes available in the stream and save them to disk
//Note that a download will reach 100% complete in terms of total progress but the 'complete' event might still not fire.
});
var urlRequest:URLRequest = new URLRequest(contentURL);
//Here we might add some headers to the URL Request for resuming a file
//but they don't matter, the 'Event.COMPLETE' will fail to fire with our without
//these headers
addCustomHeaders( urlRequest );
stream.load( urlRequest );
Imo这是一个注定要失败的代码,你故意放弃对正在发生的事情的任何控制,只是假设一切都会自行运行并进展顺利。我从来没有遇到过URLStream类的任何问题,但以下基本上是我从未做过的:
-
我从不不注册所有可用的不同错误事件(您不注册任何错误事件)。
-
我从不使用匿名听众。尽管在下载完成之前它们不应该是GC,但这是一个不必要的不安全的赌注,尤其是因为URLStream在加载最后一位时会有一点空闲的情况并不罕见。如果删除那些匿名听众真的能解决这个问题,我也不会感到惊讶。