如何在actionscript中同步方法?

时间:2010-10-29 20:37:11

标签: actionscript synchronization

问题是如何阻止一个方法被调用两次,其中第一个调用没有“完成”,因为它的处理程序正在等待加载的url例如?

情况如下:

  1. 我编写了一个flash客户端,它使用二进制加密协议与java服务器连接(我希望不必重新发明整个客户端/服务器对象通信堆栈,但我必须加密这样的数据)如果使用SSL,那么像篡改数据和查尔斯代理这样的简单工具就无法获取它们。
  2. API表现为flash作为动作脚本swf文件,API本身就是一个单例。
  3. api暴露了一些简单的方法,包括:
    1. 登录()
    2. 为getBalance()
    3. startGame()
    4. ENDGAME()
  4. 每个方法都会调用我的HttpCommunicator类。
  5. 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对象在第一个处理完整事件之前被调用两次,除非:

    1. 我每次想要发送消息时都会创建一个新的HttpCommunicator对象。我还想避免每次都创建一个URLLoader,但这不是我的代码,因此知道它的行为会更成问题。)
    2. 我可以做类似于通信的同步。这将有效地阻止,但这比压缩数据传输要好。从理论上讲,Flash客户端不应该连续两次调用相同的api函数,但我会发生这种情况。
    3. 我实现了一个消息队列。但是,这也需要围绕push和pop方法进行同步,我不知道该怎么做。
    4. 选项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完成事件处理程序被调用,它也会调用apis getBalance()函数(即flash是多线程的。)

1 个答案:

答案 0 :(得分:1)

嗯,首先,除了网络API之外,Flash不是多线程的。所有ActionScript都在同一个线程中运行。

您可以相当轻松地创建一个类似信号量的系统,其中每个通信调用都以“键”以及您已指定的参数传递。那个“键”只是一个表示你正在做的调用类型的字符串(getBalance,login等)。 “key”将是泛型对象(Object或Dictionary)中的属性,并且将引用一个数组(如果它不存在则必须创建它)。

如果数组为空,则调用将正常进行。如果没有,那么有关该调用的信息将被放入一个对象并被推入该数组。完成一个调用之后,你的完整处理程序必须只检查队列中是否有更多请求,如果是,则将其中一个请求出列并运行该请求。

关于这个系统的一件事是它仍然允许不同类型的请求并行发生 - 但是你必须为每个请求设置一个新的URLLoader(只要你在每次请求后清理它就完全合理已经完成了。