2009-04-10 17 views
1

我目前正在將Java項目翻譯成Flex 3.項目的很大一部分涉及異步通信。FLEX的新手 - 從Java翻譯異步通信

該程序將連接到一個流,開始下載數據。連接後不久,它將需要通過HTTP以相同格式(關鍵幀)下載上下文數據。在流或關鍵幀期間的各個點處,可能需要額外的HTTP呼叫,例如,獲得加密密鑰。

在Java中,我會使用一個阻塞調用來執行HTTP請求獲得這將有效地暫停或關鍵幀流,而HTTP被完成,然後將它在何處進行的關鍵。

不幸的是,Flex的是單線程的,並且與異步回調來實現的HTTP請求,這是不可能實現的相同方式的代碼。

作爲Flex的新手,我不確定通常的做法是什麼。目前,我打算保存狀態並退出,依靠HTTP完成來重新啓動暫停的流。或者,也許使用定時器......

但是對於流,我應該去耦數據正在從處理收到和緩衝它,而HTTP請求正在處理?或者是否可以忽略進度事件並讓Flex和/或OS緩衝它?

有沒有人有建議,會讓這一切更容易的建議?

謝謝!

編輯:謝謝你到目前爲止的答案...

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

通過原始ActionScript套接字API連接怎麼樣?您可以根據需要讀取數據並分派事件,每個事件觸發單獨的HTTPService調用以獲取數據。

0

當您使用HTTPService的send()方法,將返回的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; 
}