Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 addEventListeners和最佳实践_Actionscript 3_Listeners - Fatal编程技术网

Actionscript 3 addEventListeners和最佳实践

Actionscript 3 addEventListeners和最佳实践,actionscript-3,listeners,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 f

我使用以下简单代码从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和handleLoadSuccessful方法中的侦听器是否是更好的做法?侦听器是cpu密集型的吗


顺便说一句,我不明白为什么这个问题“似乎是主观的”,因为我们谈论的是性能,而不是编程风格。

由于您的类被设计为能够对同一Web服务进行多次调用,我肯定会选择选项2。考虑这一点:

var loader:URLTest = new URLTest();
loader.sendLoad("a");
loader.sendLoad("b");
现在,如果对两个调用重复使用相同的URLLoader,则无法知道哪个完整事件将对应于哪个调用

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

这里的性能问题无关紧要。创建一堆事件侦听器不会对性能造成影响,只要您在使用完这些侦听器后记得删除它们。否则,相应的URLLoader将不会被垃圾收集,并将继续堆积在内存中


另一方面:绝对没有理由从
MovieClip
扩展。如果希望类分派事件,只需扩展
EventDispatcher

调用只能是一个,我不调用sendLoad(“a”)和shorly-after-sendLoad(“b”)。我在一个网站上工作,而不是一个应用程序,侦听器总是被使用的,因为我多次调用服务器(每次单击链接时):我不能冻结它们,我试图使用它们。我扩展了MovieClip,因为这段代码来自Flash专业项目的临时主代码。关于活动的提示非常有趣。currentTarget,谢谢。我不是说你会那样使用它,我是说你可以。这使得你的类在如何使用它方面不清楚——更重要的是,不安全。您应该重新设计它,以便它只能以一种方式使用,即您打算使用的方式。为什么不安全?我有一个控制器:它的UI表示是一个有8个按钮的菜单。当您按下按钮时,每隔一个按钮就会被禁用,我调用sendLoad方法。这是上下文。通过特定的UI,它不会发生。但是,如果另一个开发人员出现并希望使用您的类(可能用于另一个UI或当前UI的重新设计),他可能会以错误的方式使用,并花费数小时进行调试。您通过UI强制执行的内容应该已经通过类本身强制执行了,因此您绝对100%确定它永远不会发生。现在,我似乎明白你是唯一一个在这个项目上工作的人,但学会那样思考仍然是一个很好的实践。您在问题中特别要求最佳实践。。。