没有合适的资源?快使用搜索试试~ 我知道了~
Flex Module专题
3星 · 超过75%的资源 需积分: 9 7 下载量 171 浏览量
2011-09-14
13:42:47
上传
评论
收藏 56KB DOC 举报
温馨提示
试读
16页
一、Module使用背景 Module 是Adobe为解决Flex应用初始化时较大的下载负载问题而设计的一种折中方案。将主Application合理分割为多个Module后,配合延迟加载策略,就可以保证主Application在初始化只加载必要的资源从而减少等待时间。未被访问的Module默认将不被加载,这样在首次访问它们时会需要额外的等待时间,当然我们也可以在监听主Application加载完毕事件中将这些Module提前载入或者直接取消使用延迟加载策略以保证 Module的响应时间。
资源推荐
资源详情
资源评论
Flex Module 专题
一、Module 使用背景
Module 是 Adobe 为解决 Flex 应用初始化时较大的下载负载问题而设计的一种折中方案。
将主 Application 合理分割为多个 Module 后,配合延迟加载策略,就可以保证主 Application
在初始化只加载必要的资源从而减少等待时间。未被访问的 Module 默认将不被加载,这样
在首次访问它们时会需要额外的等待时间,当然我们也可以在监听主 Application 加载完毕
事件中将这些 Module 提前载入或者直接取消使用延迟加载策略以保证 Module 的响应时间。
二、Module 相关类和接口简介
与 Module 相关的类和接口如下:
(1)mx.modules.Module->LayoutContainer->Container->UIComponent
(2)mx.modules.ModuleBase->EventDispatcher->Object
(3)mx.modules.ModuleLoader->VBox->Box->Container->UIComponent
(4)mx.modules.ModuleManager->Object
(5)mx.modules.IModuleInfo->IEventDispatcher
(6)mx.event.ModuleEvent->ProgressEvent->Event->Object
(7)mx.core.IFlexModuleFactory
1、Module 和 ModuleBase
Module 类是一个容器,继承自 FlexSprite,引入了一些框架代码,而 ModuleBase 类则继承
自 EventDispatcher。因此,如果我们的 Module 需要可视化元素,则扩展 Module;反之则
扩展 ModuleBase。ModuleBase 由于不依赖任何框架代码,生成的模块体积会更小。
例如一个带有可供用户输入信息的输入框 Module:
//FlexModule/AsContactList.as
package
{
import mx.containers.Form;
import mx.containers.FormItem;
import mx.controls.TextInput;
import mx.modules.Module;
public class ASContactList extends Module
{
private var _form:Form;
private var _firstNameItem:FormItem;
private var _lastNameItem:FormItem;
public function ASContactList()
{
super ();
this.percentWidth = 100;
this.percentHeight = 100;
}
override protected function createChildren():void
{
super.createChildren();
_form = new Form();
_firstNameItem = createInputItem( "FirstName:");
_lastNameItem = createInputItem( "LastName:");
_form.addChild( _firstNameItem );
_form.addChild( _lastNameItem );
addChild( _form );
}
private function createInputItem( label:String ):FormItem
{
var item:FormItem = new FormItem();
item.label = label;
item.addChild( new TextInput() );
return item;
}
}
}
例如一个含有 greet,welcomeeBack 方法的 ModuleBase:
//FlexModule/EntryStateModule.as
package
{
import mx.modules.ModuleBase;
public class EntryStateModule extends ModuleBase
{
public function EntryStateModule()
{
}
public function greet( first:String, last:String ):String
{
return "Hello,"+ first + " "+ last + ".";
}
public function welcomeBack(first:String,last:String):String
{
return "Nice to see you again,"+ first + ".";
}
}
}
2、ModuleLoader
ModuleLoader 是一个可视化的容器类,可动态加载或卸载扩展自 Module 或 ModuleBase 的
SWF。其功能类似于 mx.controls.SWFLoader 组件,不同之处是被载入的 SWF 需要实现
IFlexModuleFactory 接口,这样做的目的是为了允许应用程序在运行期间动态载入模块化
SWF 而不需要在主应用程序中实现此接口,更多关于 IFlexModuleFactory 的内容请参见文
中其它相关部分(在本文第六节给 Module 减肥部分中,你可以看到一个继承自 Sprite 但却
很莫名地要实现 IFlexModuleFactory 接口的“类 Module”组件,其原因就在于此)。
ModuleLoader 的 url 属性被指定或改变时,就会调用 loadModule 方法加载 Module,但是当
url=" " 时 则 会 调 用 unloadModule 卸 载 Module 。 另 外 , 在 调 用 unloadModule 方 法 时 ,
ModuleLoader 只是将相应 Module 的引用置为 null 释放内存,url 属性值并未改变。强烈建
议在使用 moduleloader 做切换时,先调用 unloadModule()以确保调用 loadModule()方法时只
有一个对象。
ModuleLoader 的事件如下:
(1)error
下载模块出错时调度。
(2)loading
ModuleLoader 开始加载 URL 时调度
(3)progress
下载模块的过程中调度。下载进程期间定期调度此模块。
(4)ready
模块完成下载时调度。
(5)setup
已下载了足够的模块内容,您可以获得有关模块的信息时调度。
(6)unload
卸载模块时调度。
(7)urlChanged
给 ModuleLoader 新的 URL 时调度。
如下展示了一个自定义的 ModuleLoader,分别对这七个事件进行了监听。值得一提的是
ModuleLoader 对象实例可以直接作为 ProgressBar 的 source 属性值被使用。
<?xml version="1.0" encoding="utf-8"?>
<!--FlexModule/CustomModuleLoader.mxml -->
<mx:ModuleLoader xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"
creationComplete="init()">
J <mx:Script>
JJJ <![CDATA[
JJJ public function init():void {
JJJJJJJ addEventListener("urlChanged", onUrlChanged);
JJJJJJJ addEventListener("loading", onLoading);
JJJJJJJ addEventListener("progress", onProgress);
JJJJJJJ addEventListener("setup", onSetup);
JJJJJJJ addEventListener("ready", onReady);
JJJJJJJ addEventListener("error", onError);
JJJJJJJ addEventListener("unload", onUnload);
JJJJJJJ standin = panel;
JJJJJJJ removeChild(standin);JJJJJJ
JJJ }
JJ
JJJ public function onUrlChanged(event:Event):void {
JJJJJJJ if (url == null) {
JJJJJJJJJJJ if (contains(standin))
JJJJJJJJJJJJJJJ removeChild(standin);
JJJJJJJ } else {
JJJJJJJJJJJ if (!contains(standin))
JJJJJJJJJJJJJJJ addChild(standin);
JJJJJJJ }
JJJJJJJ progress.indeterminate=true;
JJJJJJJ unload.enabled=false;
JJJJJJJ reload.enabled=false;
JJJ }
JJJ public function onLoading(event:Event):void {
JJJJJJJ progress.label="Loading module " + url;
JJJJJJJ if (!contains(standin))
JJJJJJJJJJJ addChild(standin);
JJJJJJJ progress.indeterminate=true;
JJJJJJJ unload.enabled=false;
JJJJJJJ reload.enabled=false;
JJJ }
JJ
JJJ public function onProgress(event:Event):void {
JJJJJJJ progress.label="Loaded %1 of %2 bytes...";
JJJJJJJ progress.indeterminate=false;
JJJJJJJ unload.enabled=true;
JJJJJJJ reload.enabled=false;
JJJ }
JJ
JJJ public function onSetup(event:Event):void {
JJJJJJJ progress.label="Module " + url + " initialized!";
JJJJJJJ progress.indeterminate=false;
JJJJJJJ unload.enabled=true;
JJJJJJJ reload.enabled=true;
JJJ }
JJ
JJJ public function onReady(event:Event):void {
JJJJJJJ progress.label="Module " + url + " successfully loaded!";
JJJJJJJ unload.enabled=true;
JJJJJJJ reload.enabled=true;
JJJJJJJ if (contains(standin))
JJJJJJJJJJJ removeChild(standin);
JJJ }
JJ
JJJ public function onError(event:Event):void {
剩余15页未读,继续阅读
资源评论
- quri03022011-09-29以代码为主,说得也比较详细
_Lunay
- 粉丝: 381
- 资源: 49
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功