Actionscript 3 addEventListeners和最佳实践
我使用以下简单代码从PHP脚本中检索值: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
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%确定它永远不会发生。现在,我似乎明白你是唯一一个在这个项目上工作的人,但学会那样思考仍然是一个很好的实践。您在问题中特别要求最佳实践。。。