首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3:重用URLLoader、URLRequest和URLVariables实例

AS3:重用URLLoader、URLRequest和URLVariables实例
EN

Stack Overflow用户
提问于 2018-03-10 00:19:33
回答 1查看 450关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 09:45:24

您肯定永远不会重用任何与外部操作相关的实例,并且您应该在不需要它们的时候彻底地处理它们。垃圾收集器(垃圾收集器,GC)处理这些对象的开销与您可能陷入的噩梦无关,因为您的外部操作通过共享相同的操作实例而发生冲突。

URLVariablesURLRequest不需要任何特殊处理,只需将null设置为引用它们的任何变量,并确保分配给局部变量的方法不会产生任何函数闭包。那么,将URLRequest.data设置为null以破坏此引用。

另一方面,URLLoader需要被推到一边:

  1. 如果URLLoader.data是一个ByteArray,那么您应该使用它(除非您需要它)。
  2. URLLoader.data设置为
  3. 最初,订阅所有带有弱引用的错误处理程序( addEventListener的第五个参数设置为true),而不取消订阅它们。弱键不会影响GC的判断,而保留订阅可能会使您避免偶尔出现未处理的错误事件。
  4. 当然,要取消订阅所有非错误处理程序。
  5. 在所有处理程序中,首先检查Event.target是否是有效的URLLoader实例,以避免处理死/已处理的URLLoader中的事件。
  6. URLLoader.close()打电话以防万一。是的,在所有这些都做完之后。

下面是我用一种简单的方式加载东西的类。它建立在我上面列出的相同的原则之上。它允许加载文本/二进制数据,还提供了一些防止网络不稳定的证据:如果您知道请求往往会失败,那么可以将repeatCount参数设置为更高的值,以提供故障安全加载。

使用

代码语言:javascript
复制
// 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.
    }
}

Implementation

代码语言:javascript
复制
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;
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49204051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档