Как заставить URLLoader возвращать AsyncToken?

Я пытался получить двоичные данные через HTTP для своего приложения Flex и наткнулся на некоторые препятствия. Люди говорили, что HTTPService плохо справляется с двоичными данными, используя URLLoader. Но URLLoader не имеет приятного интерфейса AsyncToken / IResponder, который предоставляет HTTPService.

Итак, я немного поискал и не смог найти никого, кто бы расширил URLLoader для предоставления такой функциональности. Я пошел дальше и сам попробовал: http://pastebin.com/d7369d0e0

В основном он обертывает URLLoader и AsyncToken и сопоставляет события COMPLETE, IO_ERROR и SECURITY_ERROR из URLLoader с результатами / ошибками, которые возникают в AsyncToken.

Основное использование:

var tidbitLoader:AsyncURLLoader = new AsyncURLLoader();
tidbitLoader.dataFormat = URLLoaderDataFormat.BINARY;

var asyncToken:AsyncToken = tidbitLoader.load(new URLRequest("http://localhost/SampleTidbit.swf"));

asyncToken.addResponder(this);

public function result(resultEvent:Object):void
{
    trace("result");
}

public function fault(faultEvent:Object):void 
{
    var fault:FaultEvent = faultEvent as FaultEvent;
    trace("fault: " + fault.toString());
}

Это правильный подход к проблеме? Есть ли существующие решения? Хотелось бы услышать отзывы.

Спасибо,

Картик


person Karthik    schedule 24.12.2009    source источник
comment
Итак, двоичные данные, которые вы хотите прочитать, являются SWF-файлами? Но вы не хотите просто запускать SWF (как это делает SWFLoader или Loader)? Вы пытались использовать HTTPService с параметром resultFormat, установленным на текст?   -  person James Ward    schedule 28.12.2009
comment
Привет, Джеймс, я попытался использовать HTTPService с resultFormat в качестве текста, но затем, когда я установил SWFLoader.source на результат этого вызова, SWF не загрузился! Когда я пробую это с моим AsyncURLLoader и в результате получаю ByteArray, он работает.   -  person Karthik    schedule 30.12.2009
comment
Может быть, вам нужно попробовать создать ByteArray, используя writeUTFBytes или что-то в этом роде?   -  person James Ward    schedule 30.12.2009
comment
Чтобы это можно было закрыть, я дал более краткий ответ ниже.   -  person James Ward    schedule 30.12.2009


Ответы (2)


Используйте resultFormat = text на HTTPService, а затем создайте новый ByteArray и вызовите writeUTFBytes, чтобы записать текст из результата HTTPService в ByteArray. Тогда вы сможете установить для этого ByteArray значение SWFLoader.source или вызвать Loader.loadBytes.

person James Ward    schedule 30.12.2009

Я попробовал ваше решение, Джеймс, с приложением AIR 1.5, но при установке ByteArray в свой SWFLoader.source получаю следующую ошибку. Любые идеи? Я думал, что где-то читал, что AIR изменяет заголовки HTTP, и это может быть причиной? Спасибо, Бен.

[DEBUG] mx.messaging.Channel 'direct_http_channel' канал, отправляющее сообщение: (mx.messaging.messages :: HTTPRequestMessage) # 0 body = (Object) # 1 clientId = (null) contentType = "application / x-www-form- urlencoded "destination =" DefaultHTTP "headers = (Object) # 2 httpHeaders = (Object) # 3 messageId =" 3044E76C-CF0E-2D5F-96BE-74CFF62098B0 "method =" GET "recordHeaders = false timestamp = 0 timeToLive = 0 url = "http://www.myurl.com/test.jpg" [ИНФОРМАЦИЯ] mx. обмен сообщениями.Продюсер '4FA2CCF4-2B3E-4EAB-2873-74CFF612AA72', производитель подключен. [ИНФОРМАЦИЯ] mx.messaging.Producer '4FA2CCF4-2B3E-4EAB-2873-74CFF612AA72' подтверждение производителя '3044E76C-CF0E-2D5F-96BE-74CFF62098B0'. [INFO] mx.rpc.http.HTTPService Декодирование ответа HTTPService [DEBUG] mx.rpc.http.HTTPService Обработка сообщения ответа HTTPService: (mx.messaging.messages :: AcknowledgeMessage) # 0 body = "Øÿà Ошибка # 2044: Необработанный IOE :. text = Ошибка # 2124: загруженный файл неизвестного типа.

person Community    schedule 28.01.2010