Air/Flex动态加载module及其依赖的RSL

Jack 撰写  

有关Flex和Air中如何使用RSL网上教程很多,google一下即可,这里不多做叙述了

而这次遇到的问题是这样的:

发布时只发布一个主程序(Web或者Air方式),而不发布所需要的module及其依赖的swc,只在运行时根据需要加载module及其依赖的swc

1.       建立一个实验用的module工程:

先准备一个module工程,普通的Flex Project(web)即可,主程序名无所谓,因为这个工程只是为了编译module对象用的

在Properties->Flex Build Path中引入所要依赖的swc,这个例子中使用了TweenLite.swc

注意AIR project的默认Link TypeMerge into code,改成RSL。如图:

新建一个包modules并新建一个module程序:MyModule1.mxml

到Properties->Flex Modules中修改该module的optimize属性为none,如下图

点击Edit按钮,弹出下图

选择Do not optimize(…)

在MyModule1.xml中使用TweenLite做一个简单的动画:

TweenLite.to(<strong>this</strong>.goed,4,{x:500});

编译工程,

此时MyModule1.mxml被编译生成为MyModule1.swf

TweenLite.swc会被编译成TweenLite.swf

复制到要被加载的目录下,我的是

http://127.0.0.1/testflex/TweenLite.swf

http://127.0.0.1/testflex/modules/MyModule1.swf

2.       建立主工程(Flex Web):

新建一个Flex Project(web),不要使用引入TweenLite.swc

新建一个用来控制加载TweenLite的类:

tasks/TaskLoadRSL.as

在这个类中,使用URLLoader将TweenLite.swc从http://127.0.0.1/testflex/TweenLite.swf上加载下来,主要代码如下:

var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;//必须有这一句,RSL必须和主程序在同一个域中
loader.load(new URLRequest(this.web),context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,localLoadCompleteHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,localLoadIoErrorHandler);

加载完TweenLite后不需要任何操作,直接开始加载module即可

使用IModuleInfo或ModuleLoader加载module都可以,详见源代码

3.       建立主工程 (AIR):

Air中比Flex要麻烦,因为发布时只发布主程序,所以运行时需要先检测本地是否有swc和

module

如果有就直接加载运行(同Web)

如果没有就从网站上下载到本地,然后再加载

主要代码如下:

从网络地址上加载:

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, loadFromWebCompleteHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, loadFromWebErrorHandler);
loader.load(new URLRequest(web))

加载完,保存到本地:

var loader:URLLoader = URLLoader($e.target);
var data:ByteArray = ByteArray(loader.data);
var file:File = new File(File.applicationDirectory.resolvePath(this.local).nativePath);
trace('save file to' + file.nativePath);
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeBytes(data);
fileStream.close();
this.loadFromLocalFile();

本地加载过程同Flex Web

更多内容参加源代码:DynamicTestLoadModuleAndRSL


2 条评论

  1. syw00syw
    发表了 2010年05月5日 在 6:18 下午 | 永久链接 |

    路过。。。。

  2. syw00syw
    发表了 2010年05月5日 在 6:19 下午 | 永久链接 |

    居然还要审核。。。

发表评论

你必须在 登录 后才能发表评论.