我个人会避免使用 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 。