Завершить событие до полной загрузки

В моем приложении мне нужно скачать несколько файлов с сервера. Я использовал следующий код:

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

Работает нормально. Но проблема у меня заключается в том, что когда интернет работает медленно, иногда он вызывает событие завершения, даже если файл загружен не полностью. Есть ли способ предотвратить это? Любая помощь будет оценена.

ОБНОВЛЕНИЕ: рекомендуется ли использовать событие progress для проверки завершения загрузки вместо использования события complete. Подобно:

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

1 ответ

Я не могу комментировать, потому что у меня недостаточно репутации.

Ранее у меня была похожая проблема, когда файловый поток записывал отчеты как завершенные, хотя на самом деле это не так. Это происходит только на старых устройствах и происходит случайным образом. Мне показалось, что мое тестирование подтвердило, что файл Flash-отчетов сохранен до того, как операционная система завершит работу. Когда происходит чтение, он сообщает, что файл не найден.

Я решил это довольно грубо, используя setTimeout, и неоднократно проверял, были ли данные полными.

Другие вопросы по тегам