AS3:重用URLLoader,URLRequest和URLVariables实例

时间:2018-03-10 00:19:33

标签: actionscript-3 optimization actionscript

我的Flash项目大量使用URLLoader.load从Web服务器加载内容并发布到php页面。我应该重用我的URLLoader,URLRequest和URLVariables实例,还是应该每次都创建新实例?如果我每次都应该创造新的,旧的需要以某种方式处理吗?

1 个答案:

答案 0 :(得分:2)

您绝对不应该重复使用与外部操作相关的任何实例,并且在您不需要它们的那一刻就应该彻底处理它们。垃圾收集器(GC)处理这些对象的开销几乎没有任何内容,只要您的外部操作通过共享相同的操作实例而发生碰撞,您可能会陷入噩梦。

URLVariables URLRequest 不需要任何特殊处理,只需将 null 设置为引用它们的任何变量,并确保该方法,它们所在的位置分配给局部变量,不产生任何函数闭包。好吧,将 URLRequest.data 设置为 null 以打破此引用。

另一方面,

URLLoader 需要推动一下:

  1. 如果 URLLoader.data ByteArray ,那么您应该 ByteArray.clear()它(除非您需要它)。
  2. URLLoader.data 设置为 null
  3. 最初使用弱引用( addEventListener 的第五个参数设置为 true )订阅所有错误处理程序,并且不要取消订阅它们。弱密钥不会影响GCs的判断,同时保留订阅可能会使您免于偶尔的未处理错误事件案例。
  4. 当然要取消订阅所有非错误处理程序。
  5. 在所有处理程序中,首先检查 Event.target 是否为有效的 URLLoader 实例,以避免处理死亡/处置 URLLoader
  6. 以防万一,请致电 URLLoader.close()。是的,完成上述所有操作后。
  7. 下面是我用来以简单方式加载东西的类。它建立在我上面列出的相同原则之上。它允许加载文本/二进制数据,并提供一些针对不稳定网络的证据:如果您知道请求往往失败,可以将 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;
            }
        }
    }