【问题标题】:Why does URLStream sometimes not fire Event.COMPLETE?为什么 URLStream 有时不会触发 Event.COMPLETE?
【发布时间】:2016-04-12 17:42:15
【问题描述】:

我有一个应用程序正在下载几个大型二进制文件并将它们保存到磁盘。在某些机器上它可以正常工作,而在其他一些机器上,每隔一段时间,下载将进行到 99.9% 完成,并且 URLStream 对象不会触发 Event.COMPLETE

这与此处出现的问题几乎相同:

Why does URLStream complete event get dispatched when the file is not finished loading?

我已尝试使用其中一个答案中描述的“Cache Bust”方法,但仍然没有骰子。

任何帮助将不胜感激。

这里有一些示例代码来帮助说明我正在尝试做的事情:

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 );

【问题讨论】:

  • 我已更新帖子以包含代码示例。
  • *“在某些系统上,它会偶尔触发一次......在其他系统上它永远不会失败......”我会首先检查那些失败的系统。这是一个互联网连接问题(即:他们有什么东西会切断大量下载吗?等)。似乎是硬件/网络问题,而不是您的代码有任何问题(否则它永远不会适用于所有系统,对吧?)。
  • 这也是一个 AIR 应用程序吗?如果是,可能会定期检查磁盘上的总字节数,您自己的代码可以决定下载是否完成(获取所有字节)并执行任何操作...如果 99.9% 表示缺少块,只需重新下载最终范围字节并附加到下载的完整字节。事实上:为什么不尝试进入更小的块,缝合部分(file.append)以在磁盘上制作最终的大文件......

标签: actionscript-3 urlstream


【解决方案1】:

Imo 这是一个注定失败的代码,你故意放弃对正在发生的任何事情的任何控制,只是假设一切都会自行工作并顺利进行。我从来没有遇到过 URLStream 类的任何问题,但这基本上是我从未做过的事情:

  1. 我从不注册所有可用的不同错误事件(您没有注册任何)。

  2. 我从不使用匿名监听器。尽管在下载完成之前它们不应该是 GC,但这在 imo 中是一个不必要的不​​安全赌注,特别是因为 URLStream 在加载最后一位时空闲一点的情况并不少见。如果删除这些匿名听众真的能解决问题,我不会感到惊讶。

【讨论】:

  • 示例中的代码仅用于说明目的,它不是生产代码。在我的实际应用程序中,我不使用匿名函数,尽管我完全不同意它们很重要。在生产代码中,我会监听所有错误。如果您查看我链接到的帖子,就会发现完全相同的问题。
  • 贴出与实际代码无关的代码是没有意义的。哪里有问题。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2010-11-18
  • 2020-01-09
  • 1970-01-01
相关资源
最近更新 更多