使用Alchemy,大多数构建都是静态swc构建。这些非常适合直接链接到库,但如果您尝试一次使用多个,则通常(总是?)会遇到共享内存空间的问题。我读过的一个解决方案是构建swf,然后将它们动态加载到自己的ApplicationDomain中。这将为所有库提供自己的内存,并允许您加载多个Alchemy库。 (正如adobe论坛上的这些主题所述:http://forums.adobe.com/message/3665801和http://forums.adobe.com/message/3927791)
我的问题是:如何加载这些swf并获取其中的代码?似乎没有关于这个问题的任何文档,虽然我知道如何加载swf,但我不知道如何获取代码,因为我没有任何swf接口。
答案 0 :(得分:0)
问题是我们想要动态加载Alchemy lib,但是如果我们将库构建为SWF它将无法工作(因为它构成了一个独立的应用程序)。但我们无法动态加载SWC--或者我们可以吗?
这是做什么的(假设一个名为mylib
的库):
mylib
构建为SWC。mylib.swc
并解压缩library.swf
文件;将其重命名为mylib.swf
mylib.swf
嵌入binary asset ByteArray
ByteArray
传递给Loader#loadBytes cmodule.mylib.CLibInit
init
等您可以通过这种方式嵌入任意数量的Alchemy库,每个库都在自己的ApplicationDomain中运行。
答案 1 :(得分:0)
我一直在尝试通过创建一个新的ApplicationDomain并将其传递给加载的加载器上下文来动态加载库。我做错了是存储对该ApplicationDomain的引用并尝试从该引用中获取定义。由于某种原因,返回null。通过实现paleozogt的答案并改变它来动态加载swf,我最终得到了正确的代码,该代码不使用对ApplicationDomain的存储引用,而是从loader的contentLoaderInfo中获取它。
如果要动态加载库,请输入以下代码:
package
{
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class AlchemyDynamicLoad
{
private var _library:Object;
private var _loader:Loader;
public function AlchemyDynamicLoad()
{
var loaderContext:LoaderContext = new LoaderContext(false, new ApplicationDomain());
var request:URLRequest = new URLRequest("../assets/mylib.swf");
_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
_loader.load(request, loaderContext);
}
private function completeHandler(event:Event):void
{
// NOTE: Storing a reference to the application domain you feed to the loaderContext and then trying to get the
// definition from that reference is not going to work for some reason. You have to get the applicationDomain
// from the contentLoaderInfo, otherwise getDefinition returns null.
var libClass:Class = Class(_loader.contentLoaderInfo.applicationDomain.getDefinition("cmodule.mylib.CLibInit"));
_library = new libClass().init();
}
}
}
如果你想嵌入它,那么这就是代码(paleozogt的答案):
package
{
import flash.display.Loader;
import flash.events.Event;
public class AlchemyStaticLoad
{
[Embed(source="../assets/mylib.swf", mimeType="application/octet-stream")]
private static var _libraryClass:Class;
private var _library:Object;
private var _loader:Loader;
public function AlchemyStaticLoad()
{
_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
_loader.loadBytes(new _libraryClass());
}
private function completeHandler(event:Event):void
{
var libClass:Class = Class(_loader.contentLoaderInfo.applicationDomain.getDefinition("cmodule.mylib.CLibInit"));
_library = new libClass().init();
}
}
}