我的Flash项目大量使用URLLoader.load从Web服务器加载内容并发布到php页面。我应该重用我的URLLoader,URLRequest和URLVariables实例,还是应该每次都创建新实例?如果我每次都应该创造新的,旧的需要以某种方式处理吗?
答案 0 :(得分:2)
您绝对不应该重复使用与外部操作相关的任何实例,并且在您不需要它们的那一刻就应该彻底处理它们。垃圾收集器(GC)处理这些对象的开销几乎没有任何内容,只要您的外部操作通过共享相同的操作实例而发生碰撞,您可能会陷入噩梦。
URLVariables 和 URLRequest 不需要任何特殊处理,只需将 null 设置为引用它们的任何变量,并确保该方法,它们所在的位置分配给局部变量,不产生任何函数闭包。好吧,将 URLRequest.data 设置为 null 以打破此引用。
另一方面,URLLoader 需要推动一下:
下面是我用来以简单方式加载东西的类。它建立在我上面列出的相同原则之上。它允许加载文本/二进制数据,并提供一些针对不稳定网络的证据:如果您知道请求往往失败,可以将 repeatCount 参数设置为更高的值以提供故障安全加载 强>
<强>用法强>:
// Load binary data over unstable network.
DataFiles.load("data.dat", onData, true, 10);
// Load XML file as text over a stable network or from the local storage.
DataFiles.load("setup.xml", onSetup);
function onData(source:ByteArray):void
{
if (!source)
{
// Loading failed. Error case.
}
else
{
// File is loaded normally.
}
}
function onSetup(source:String):void
{
try
{
var aSetup:XML = new XML(source);
// Process loaded XML normally.
}
catch (fail:Error)
{
// The source is either null or an invalid XML string.
// Loading is failed, basically. Error case.
}
}
<强>实施强>:
package simplify
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
public class DataFiles
{
static private var list:Vector.<DataFiles> = new Vector.<DataFiles>;
static public function load(url:String, handler:Function, binary:Boolean = false, repeatCount:int = 1):void
{
var aLoader:DataFiles = new DataFiles;
aLoader.url = url;
aLoader.binary = binary;
aLoader.handler = handler;
aLoader.repeatCount = repeatCount;
list.push(aLoader);
aLoader.start();
}
private var url:String;
private var binary:Boolean;
private var handler:Function;
private var loader:URLLoader;
private var repeatCount:int;
private function start():void
{
loader = new URLLoader;
if (binary) loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onError, false, 0, true);
loader.load(new URLRequest(url));
}
private function destroyLoader():void
{
if (!loader) return;
loader.removeEventListener(Event.COMPLETE, onComplete);
var aDead:Loader = loader;
loader = null;
aDead.data = null;
aDead.close();
}
private function onComplete(e:Event):void
{
if (e.target != loader) return;
var aResult:* = loader.data;
var aHandler:Function = handler;
destroy();
destroyLoader();
aHandler(aResult);
}
private function onError(e:IOErrorEvent):void
{
if (e.target != loader) return;
destroyLoader();
repeatCount--;
if (repeatCount >= 0)
{
start();
}
else
{
var aHandler:Function = handler;
destroy();
aHandler(null);
}
}
private function destroy():void
{
var anIndex:int = list.indexOf(this);
if (anIndex > -1) list.splice(anIndex, 1);
handler = null;
url = null;
}
}
}