問題是我怎麼能停止一個方法被調用兩次,其中第一個調用沒有「完成」,因爲它的處理程序正在等待一個url加載例如?如何同步actionscript中的方法?
這裏的情況是:
- 我寫了一個Flash客戶端與使用二進制加密協議的Java服務器接口(我希望不會有重新發明了整個客戶端/服務器對象通信堆棧,但我必須以這樣一種方式加密數據,即使用簡單工具(如篡改數據和查爾斯代理)如果使用SSL,則無法將其加密)。
- API將自身呈現爲flas作爲actionscript swf文件,並且API本身是單例。
- 的API暴露了一些簡單的方法,包括:
- 登錄()
- 爲getBalance()
- startGame()
- 殘局()
- 每種方法都會打電話給我HttpCommunicator類。
HttpCommunicator.as(錯誤處理和東西刪除):
public class HttpCommunicator {
private var _externalHalder:function;
public function communicate(data:String, externalHandler:APIHandler):void {
// do encryption
// add message numbers etc to data.
this._externalHalder = externalHandler;
request.data = encrypt(addMessageNumers(data)));
loader.addEventListener(Event.COMPLETE, handleComplete);
loader.load(request);
}
private function handleComplete(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
String data = decrypt(loader.data);
// check message numbers match etc.
_externalHandler(data);
}
的問題,這是我不能保護它HttpCommunicator對象被調用之前,首先兩次已經處理完整的情況下,除非:
- 我每創建一個新的HttpCommunicator對象都要發送消息。我也想避免每次都創建一個URLLoader,但這不是我的代碼,因此知道它的行爲會更困難)。
- 我可以做類似syncronize通信。這會有效地阻止,但這比阻止數據傳輸更好。理論上,Flash客戶端不應該連續調用兩次相同的api函數,但我會發生。
- 我實現了一個消息隊列。然而,這也需要圍繞push和pop方法進行syncronization,我無法找到該方法。
將選項1.即使工作?如果我有一個方法,一個單說爲getBalance,併爲getBalance方法有:
// class is instantiated through a factory as a singleton
public class API{
var balanceCommunicator:HttpCommunicator = new HttpCommunicator(); // create one for all future calls.
public funciton getBalance(playerId:uint, hander:Fuction):Number {
balanceCommunicator.communicate(...); // this doesnt block
// do other stuff
}
將在第二呼叫痛擊第一電話傳播者變量?即它會像靜態一樣行爲,因爲只有API對象的一個副本?
如果說在GUI上有一個按鈕「更新餘額」,並且用戶不斷點擊它,同時說一個URLLoader完成事件hander被調用,同時也可以使apis getBalance()函數(即Flash是多線程的)。