Завершить событие до полной загрузки
В моем приложении мне нужно скачать несколько файлов с сервера. Я использовал следующий код:
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, и неоднократно проверял, были ли данные полными.