addEventListeners和最佳实践

时间:2011-07-16 10:21:02

标签: actionscript-3 listeners

我正在使用这个简单的代码从PHP脚本中检索值:

package 
{
    import flash.display.MovieClip;
    import flash.net.URLLoader;
    import flash.net.URLVariables;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    //
    public class URLTest extends MovieClip
    {
        //
        var scriptLoader:URLLoader;
        //
        public function URLTest()
        {
            scriptLoader = new URLLoader();
            scriptLoader.addEventListener(Event.COMPLETE, handleLoadSuccessful);
            scriptLoader.addEventListener(IOErrorEvent.IO_ERROR, handleLoadError);
        }
        //;
        public function handleLoadSuccessful($evt:Event):void
        {
            trace("Message sent.");
            trace($evt.target.data);
        }
        //
        public function handleLoadError($evt:IOErrorEvent):void
        {
            trace("Message failed.");
        }
        //
        public function sendLoad(variable):void
        {
            var scriptRequest:URLRequest = new URLRequest("http://mydomain/myapp/my.php");
            var scriptVars:URLVariables = new URLVariables();

            scriptVars.var1 = variable;

            scriptRequest.method = URLRequestMethod.POST;
            scriptRequest.data = scriptVars;

            scriptLoader.load(scriptRequest);
            trace(scriptLoader);
        }

    }

}

如果你看一下URLTest构造函数,你会发现我初始化了一个URLLoader实例的监听器。

声明一个方法initListeners并在每次调用sendAndLoad时调用它是更好的做法吗?因此,删除handleLoadError和handleLoadSuccesful方法中的侦听器会更好吗?听众是cpu密集型的吗?

是的,我不明白为什么这个问题“似乎是主观的”,因为我们谈论的是表演,而不是编程风格。

1 个答案:

答案 0 :(得分:0)

由于您的课程旨在能够对同一个网络服务进行多次调用,我肯定会选择2。请考虑以下事项:

var loader:URLTest = new URLTest();
loader.sendLoad("a");
loader.sendLoad("b");

现在,如果您为两个调用重复使用相同的URLLoader,则无法知道哪个COMPLETE事件将与哪个调用相对应。

要解决此问题,您需要为每个调用创建一个URLLoader(+事件侦听器),并将其放入Array中以便能够识别它。当答案来自服务器 - 无论是COMPLETE还是IOERROR - 您可以删除事件侦听器并从阵列中删除标识的URLLoader(匹配event.currentTarget的URLLoader)。

这里的性能问题微不足道。只要你记得在完成它们时删除它们,就不会有创建一堆事件监听器的性能损失。否则,相应的URLLoaders将不会被垃圾收集,并将继续堆积在内存中。

旁注:绝对没有理由延伸MovieClip。如果您希望班级发送活动,只需展开EventDispatcher