【发布时间】:2013-01-24 03:08:04
【问题描述】:
我正在编写一个 AIR kiosk 应用程序,它每晚都会连接到 WordPress 服务器,获取包含所有内容路径的 JSON 文件,然后下载该内容并将其保存到 kiosk 硬盘驱动器。
有数百个文件(jpg、png、f4v、xml),其中大多数可以毫无问题地下载/保存。但是,有两个 f4v 文件永远不会完全下载。 complete 事件确实被调度了,但是如果我比较 bytesTotal (来自 progress 事件)与 bytesAvailable (来自 complete 事件)它们不匹配; bytesTotal 更大。 bytesTotal(来自进度事件)与服务器上的字节匹配。
进度事件中的 bytesLoaded 永远不会增加到与 bytesTotal 匹配的程度,因此我也不能依赖进度事件。这似乎每次都发生在相同的两个视频上。视频不是很大,一个是13MB,一个是46MB。我有较大的视频可以毫无问题地下载。
编辑:重启我的电脑后,这两个视频现在已经完成下载,但我在 300kb png 文件时遇到了同样的问题。
如果我将 url 粘贴到 Firefox 中,它会正确下载。我还编写了一个简单的 c# 应用程序来下载文件,它能够毫无问题地下载它们,所以它似乎是 Flash/AIR 的问题。
编辑:这是一个更简单的代码版本,来自一个测试项目,它是唯一的代码(网址在我们的本地网络上,因此您无法自己下载文件):
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.net.URLStream;
[SWF(backgroundColor="#000000", frameRate="24", width="640", height="480")]
public class Test extends Sprite {
private var fileSize:Number;
private var stream : URLStream;
private var url:String = "http://192.168.150.219/wordpress2/wp-content/uploads/2012/12/John-Butler-clip1.f4v";
public function Test() {
if (stage)
init();
else
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event=null):void {
this.removeEventListener(Event.ADDED_TO_STAGE, init);
stream = new URLStream();
stream.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
stream.addEventListener(Event.COMPLETE, onLoadComplete);
stream.load(new URLRequest(url));
}
private function onLoadProgress(event:ProgressEvent):void {
fileSize = event.bytesTotal;
var percent:Number = event.bytesLoaded / event.bytesTotal * 100;
trace(percent + "%"); // this never gets to 100%
}
private function onLoadComplete(event:Event):void {
trace("loaded", stream.bytesAvailable, "of", fileSize);
// outputs "loaded 13182905 of 13184365"
// so why is it "complete" when it isn't fully downloaded?
}
}
}
【问题讨论】:
-
嗨!代码太长,几分钟后无法理解.. 下次请只包括问题所在的部分.. a) 在 loadNext() 中您调度事件,但您在 mEventManager 上收听它,而不是这个。如果没问题,您可以编辑 onStreamProgress() 以检查是否 (e.loadedbytes == e.bytestotal),并手动调用完整函数。希望它有所帮助,我真的刚刚接触到代码。
-
好吧,我不完全确定问题出在哪里:) 我正在调度的完整事件不是我在 init() 方法中收听的事件,而是添加到网址流。当队列中的所有项目都完成下载/保存后,我会调度另一个类正在侦听的完整事件。
标签: actionscript-3 flash air