完全下载前完成事件触发

时间:2017-08-16 06:17:43

标签: android actionscript-3 flash

在我的应用中,我需要从服务器下载几个文件。我使用了以下代码:

function downloadFile(index:int):void
{
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
    urlLoader.addEventListener(Event.COMPLETE, onLoadFileComplete);
    urlLoader.addEventListener(ProgressEvent.PROGRESS, onLoadFileProgress);
    urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onURLIOError);
    urlLoader.load(new URLRequest("some url"));
    fileNameToSave = "some name";
    trace("file name:" + fileNameToSave);
    downloading = true;
}
function onLoadFileProgress(e:ProgressEvent):void
{
    var loadedPct:uint = Math.round(100 * (e.bytesLoaded / e.bytesTotal));
}
function onURLIOError(e:IOErrorEvent):void
{
    trace("error msg");
    e.target.removeEventListener(IOErrorEvent.IO_ERROR, onURLIOError);
}
function onLoadFileComplete(e:Event):void
{
    trace("File downloaded");
    var file:File;
    file = File.documentsDirectory.resolvePath("somelocation/" + fileNameToSave);
    if(file != null)
    {
        var fileStream:FileStream = new FileStream();
        fileStream.openAsync(file, FileMode.WRITE);
        fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, outputProgressHandler);
        fileStream.addEventListener(Event.CLOSE, onSaveFile);
        fileStream.writeBytes(e.target.data);
        fileStream.close();
    }
    e.currentTarget.removeEventListener(Event.COMPLETE, onLoadFileComplete);
    e.currentTarget.removeEventListener(ProgressEvent.PROGRESS, onLoadFileProgress);
    e.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR, onURLIOError);
}
function outputProgressHandler(e:OutputProgressEvent):void
{
    if (e.bytesPending == 0)
    {
        trace("File is completely written");
    }
}
function onSaveFile(e:Event):void
{
    trace("Saved Complete");
    loadfiles();
    e.currentTarget.removeEventListener(Event.CLOSE, onSaveFile);
}

工作正常。但我遇到的问题是当互联网很慢时,即使文件没有完全下载,它也会触发完整的事件。反正有没有阻止这个?任何帮助将不胜感激。

更新:使用进度事件检查下载是否完整而不是使用完整事件是一种好习惯。像:

if(e.bytesLoaded >= e.bytesTotal)
{
    //downloadComplete
}
else
{
    //not complete
}

1 个答案:

答案 0 :(得分:1)

我无法发表评论,因为我的声誉不足。

我以前遇到类似的问题,其中文件流写入报告完整,而事实上它没有。这仅在较旧的设备上发生并随机发生。我的测试似乎确认Flash报告文件在操作系统实际完成之前已保存。当发生读取时,它将报告为未找到的文件。

我使用setTimeout粗略地解决了它并反复检查数据是否完整。