Новое в FLEX - перевод асинхронных сообщений из Java - PullRequest
1 голос
/ 10 апреля 2009

В настоящее время я перевожу проект Java на Flex 3. Большая часть проекта включает асинхронную связь.

Программа подключится к потоку, начнет загрузку данных. Вскоре после подключения потребуется загрузить контекстные данные в том же формате (ключевой кадр) по протоколу HTTP. В различных точках потока или ключевого кадра могут потребоваться дополнительные HTTP-вызовы, например, получить ключ шифрования.

В Java я использовал бы блокирующий вызов для выполнения HTTP-запросов, чтобы получить ключ, который мог бы эффективно приостановить ключевой кадр или поток во время завершения HTTP, который затем продолжил бы, где он был.

К сожалению, Flex является однопоточным, а HTTP-запросы реализуются с асинхронными обратными вызовами, поэтому невозможно реализовать код таким же образом.

Будучи новичком во Flex, я не уверен, какой будет нормальная практика для этого. В настоящее время я планирую сохранить состояние и выйти, полагаясь на завершение HTTP, чтобы перезапустить приостановленный поток. Или, может быть, использовать таймеры ...

Но для потока я должен отделить данные, полученные от обработки, и буферизовать их во время обработки запросов HTTP? Или это безопасно игнорировать события прогресса и позволить Flex и / или ОС буферизировать его?

У кого-нибудь есть советы по архитектуре, которая облегчит все это?

Спасибо!

РЕДАКТИРОВАТЬ : Спасибо за ответы до сих пор ...

в ужасе - я не уверен, что понимаю, к чему вы клоните, но я посмотрю на это.

brd6644 - одно из соединений (поток) уже является необработанным сокетом. Вопрос был в том, чтобы приостановить его и получить некоторые другие данные из другого источника.

CookieOfFortune - это выглядит полезным, спасибо.

Ответы [ 3 ]

1 голос
/ 10 апреля 2009

Flex имеет класс HTTPService. Судя по описанию вашей проблемы, я бы сказал, создайте несколько таких объектов и свяжите их с различными обработчиками событий - в зависимости от типа обработки, которую вы хотите для определенного запроса.

<mx:HTTPService url="{myURL}" id="myHTTPData" method="GET" 
                result="cacheData()" fault="downloadFault" 
                resultFormat="object">

<mx:HTTPService url="{myURL2}" id="mySessKey" method="GET" 
                result="saveSessKey()" fault="authFault" 
                resultFormat="object">

Лучше создать специальную оболочку вокруг HTTPService и использовать ее вместо этого. Это позволит вам легко создавать объекты с помощью пользовательских обработчиков событий (и освобождать их после завершения).

0 голосов
/ 10 апреля 2009

Когда вы используете метод send () HTTPService, возвращается AsyncToken. Вы можете использовать AsyncToken для синхронизации ваших событий.

private function streamResultHandler(event:ResultEvent):void
{
    ...
    for(var str : frame)
    {
        if(str == "getEncryptionKey")
        {
            var token:AsyncToken = keyHTTPService.send();
            var tokenResult:Object = token.result;
            var key = keyBuffer;
            ...
        }
    }
}

private function keyHTTPServiceResultHandler(event:ResultEvent):void
{
    keyBuffer = event.result;
}
0 голосов
/ 10 апреля 2009

Как насчет подключения через API-интерфейс сокетов ActionScript? Вы можете читать свои данные и отправлять события по мере необходимости, при этом каждое событие вызывает отдельный вызов HTTPService для получения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...