0

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

我正在考虑使用 LocalConnection 类,但在 PatrickS 的建议之后,我现在正在评估 Singleton 类的可能性。我从来没有在 AS 中使用过这种模式,并且必须承认我对它有偏见。但在这种特殊情况下,我想它会很有用。顺便说一句,在 gskinner 博客 2 implementations examples 中阅读有点惊讶。所以,我真的很欣赏你的观点,因为我知道这个主题是一场无休止的战争,就像 Mac 与 PC 一样

考虑: 1. AIR 桌面应用程序在高端 Windows PC 上运行了几个月,24x7 全天候运行。无需用户交互 2. 高性能代码是必须的,因为加载的内容是全高清图像

我的另一个担心是内存泄漏

提前致谢

4

1 回答 1

1

我个人会避免使用 Singleton,因为它会定期实施。但是,拥有此缓冲区对象的单个实例是有意义的。所以在这种情况下我要做的是让你的 Main 类创建这个对象。加载查看器时,将这个对象传递给它。然后对装载机做同样的事情。现在,您的两个 swf 共享一个可以用来通信的公共对象。然后,您可以在其上调用函数并根据需要使其调度事件(扩展 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");
        }

    }

}

主文件.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 。

于 2010-08-14T23:49:52.963 回答