2009-04-10 2 views
1

В настоящее время я перевод проекта Java на Flex 3. Большая часть проекта включает асинхронную связь.Новое для FLEX - перевод асинхронных сообщений с Java

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

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

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

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

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

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

Спасибо!

EDIT: Спасибо за ответы до сих пор ...

dirkgently - Я не уверен, я понимаю, что вы имеете в виду, но я буду смотреть в него.

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

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

ответ

1

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

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

0

Когда вы используете метод 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; 
}