AS3:Singleton类vs LocalConnection类

时间:2010-08-14 23:29:01

标签: actionscript-3 air singleton localconnection

我有一个Main类加载2个SWF(加载器和查看器,还有文档类)。他们需要与内容共享一个双缓冲区,当然,由加载器填充并由查看器显示

我正在考虑使用LocalConnection类但是在PatrickS的建议之后我现在正在评估Singleton类的可能性。我从未在AS中使用过这种模式而且必须承认我对它有偏见。但在这种特殊情况下,我猜它会很有用。顺便说一下,在gskinner博客2实现示例中读到有点惊讶。所以,我真的很感激你的观点,知道这个主题是一场无休止的战争,比如Mac与PC之类的

考虑到: 1. AIR桌面应用程序在高端Windows PC中几个月内全天候运行。没有用户互动 2.高性能代码是必须的,因为加载的内容是全高清图像

我的另一个问题是内存泄漏

提前致谢

1 个答案:

答案 0 :(得分:1)

我会单独避免使用Singleton,因为它会定期实施。但是,拥有此缓冲区对象的单个实例是有意义的。所以在这种情况下我要做的是让你的Main类创建这个对象。加载查看器时,将此对象传递给它。然后为装载机做同样的事情。现在,你的两个swfs共享一个他们可以用来进行通信的公共对象。然后,您可以调用它上面的函数,并根据需要调度事件(扩展EventDispatcher或实现IEventDispatcher)。或者你可以根据需要注册回调(应该更快一些,但不确定它是否会产生很大的不同)。

修改

看看你的另一个问题,我认为你的问题与获取正确的加载器并将数据传递给加载的内容有关。以下是您如何实现我上面提到的内容。

PhotoLoader.swf:

package  {
import flash.display.Sprite;
import flash.events.Event;

public class PhotoLoader extends Sprite {

    private var _commonObject:CommonObject;

    public function PhotoLoader() {

    }

    public function setCommonObject(commonObject:CommonObject):void {
        trace("PhotoLoader::setCommonObject", commonObject);
        _commonObject = commonObject;
        _commonObject.addEventListener(Event.INIT,handleInit);
    }

    private function handleInit(e:Event):void {
        trace("PhotoLoader::handleInit");
    }

}

} 

PhotoViewer.swf:

package  {
    import flash.display.Sprite;
    import flash.events.Event;

    public class PhotoViewer extends Sprite {

        private var _commonObject:CommonObject;

        public function PhotoViewer() {

        }

        public function setCommonObject(commonObject:CommonObject):void {
            trace("PhotoLoader::setCommonObject", commonObject);
            _commonObject = commonObject;
            _commonObject.addEventListener(Event.INIT,handleInit);
        }

        private function handleInit(e:Event):void {
            trace("PhotoViewer::handleInit");
        }

    }

}

的main.swf

package {
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class Main extends Sprite {

        private var _photoLoader:PhotoLoader;
        private var _photoViewer:PhotoViewer;
        private var _commonObject:CommonObject;

        private var _viewerLoader:Loader;
        private var _loaderLoader:Loader;

        private var _count:int = 0;

        public function Main():void {
            _commonObject = new CommonObject();
            loadSwfs();

        }

        private function loadSwfs():void {

            _viewerLoader = new Loader();
            _viewerLoader.contentLoaderInfo.addEventListener(Event.INIT,handleInit);
            _viewerLoader.load(new URLRequest("PhotoViewer.swf"));

            _loaderLoader = new Loader();
            _loaderLoader.contentLoaderInfo.addEventListener(Event.INIT,handleInit);
            _loaderLoader.load(new URLRequest("PhotoLoader.swf"));

        }

        private function handleInit(e:Event):void {
            trace("handleInit");
            var loader:Loader = (e.target as LoaderInfo).loader;
            switch(loader) {
                case _viewerLoader:
                    _photoViewer = _viewerLoader.content as PhotoViewer; 
                    _photoViewer.setCommonObject(_commonObject);
                    _count++;
                    break;
                case _loaderLoader:
                    _photoLoader = _loaderLoader.content as PhotoLoader; 
                    _photoLoader.setCommonObject(_commonObject);
                    _count++;
                    break;
            }
            if(_count == 2) { 
                _commonObject.init();
            }

        }


    }

}

共同的对象,由3个swf共享:

package  {
    import flash.events.Event;
    import flash.events.EventDispatcher;

    public class CommonObject extends EventDispatcher {

        public function CommonObject() {

        }

        public function init():void {
            dispatchEvent(new Event(Event.INIT));
        }
    }

}

基本上,当您加载查看器和加载程序swfs时,您将传递此公共对象的实例。然后注册以侦听INIT方法:这将告诉loader和viewer所有内容都已设置。所以此时你可以开始从你的查看器或加载器向另一方发送消息(你可以通过事件调度来实现);基本上在公共对象中创建一个方法来为你做或者直接在公共对象上调用dispatchEvent。