В Adobe AIR 1.5 я использую URLLoader для загрузки видео в виде фрагментов размером 1 МБ. Он загружает 1 МБ, ожидает события Event.COMPLETE и затем загружает следующий фрагмент. Серверный код знает, как создать видео из этих кусков.
Обычно все работает нормально. Однако иногда это просто останавливается без каких-либо ошибок или отправки каких-либо событий. Это пример того, что показано в журнале, который я создаю:
Uploading chunk of size: 1000000
HTTP_RESPONSE_STATUS dispatched: 200
HTTP_STATUS dispatched: 200
Completed chunk 1 of 108
Uploading chunk of size: 1000000
HTTP_RESPONSE_STATUS ...
и т.д ...
Большую часть времени он прекрасно завершает все фрагменты. Однако иногда это просто не получается в середине:
Completed chunk 2 of 108
Uploading chunk of size: 1000000
... и ничего больше, и нет сетевой активности.
Через отладку я могу сказать, что она успешно вызывает urlLoader.load (). Когда это терпит неудачу, это просто останавливается, вызывая load (), а затем вызывая callLaterDispatcher () UIComponent и затем ничего.
Кто-нибудь знает, почему это может происходить? Я настраиваю свой URLLoader так:
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, chunkComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, responseStatusHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, statusHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
И я снова использую его для каждого куска. События не вызываются, когда это не удается, и urlLoader.load () не выдает никаких исключений. Когда это удается, отправляются события HTTP_RESPONSE_STATUS, HTTP_STATUS и PROGRESS.
Спасибо!
Edit: одна вещь, которая может быть полезна, это то, что у нас есть та же функциональность загрузки, реализованная в .NET. В .NET метод request.GetResponse () иногда вызывает исключение, сообщая, что соединение было неожиданно закрыто. Мы ловим исключение, если это происходит, и пробуем этот кусок снова, пока он не будет успешным. Я пытаюсь реализовать что-то подобное здесь, но нет никаких исключений или событий ошибок.
Более подробный пример кода ниже. URLLoader настраивается, как описано выше. Переменная readAgain просто пропускает чтение нового набора байтов в файловом потоке (то есть: он пытается снова отправить старый) ... однако, он никогда не перехватывает никаких исключений, потому что ни одно из них не выдается.
private function uploadSegment():void
{
.... prepare byte array, setup url ...
// Create a URL request
var urlRequest:URLRequest = new URLRequest();
urlRequest.url = _url + "?" + paramStr;
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = byteArray;
urlRequest.useCache = false;
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));
try
{
urlLoader.load(urlRequest);
}
catch (e:Error)
{
Logger.error("Failed to upload chunk. Caught exception. Trying again.");
readAgain = true;
uploadSegment();
return;
}
readAgain = false;
}