我正在使用这个简单的代码从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密集型的吗?
是的,我不明白为什么这个问题“似乎是主观的”,因为我们谈论的是表演,而不是编程风格。答案 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
。