深入剖析Flex Flash之間的關(guān)系
本文和大家重點討論一下Flex Flash關(guān)系,主要包括Flex應(yīng)用程序的生命周期,F(xiàn)lashpalyer和Framwork的區(qū)別等內(nèi)容,相信通過本文的介紹你對兩者的關(guān)系一定會有明確的認(rèn)識。
Flex Flash關(guān)系分析
1、Flex應(yīng)用程序的生命周期
Flex應(yīng)用就其根本上講就是Flash應(yīng)用,只不過其是基于FlexFramework(由ActionScript寫就)開發(fā)的。Flex應(yīng)用程序的根對象的是SystemManager(不是我們在flex應(yīng)用上看到的Application根元素),繼承自flash.dispaly.MovieClip—flashplayerdisplaytype,MovieClip是一種支持timeline基本元素幀frame的對象,在FlexFramework中SystemManager是特殊的,含有兩幀(其他component都是一幀的),分別是preloader和真正的Application,preloader幀可以迅速下載下來并用于顯示應(yīng)用下載進度,一旦Flex應(yīng)用的SystemManager實例進入第二幀,將創(chuàng)建Flex主應(yīng)用application實例并賦予本身的屬性application(在進入第二幀之前是null),自此application(flex主應(yīng)用)的內(nèi)部生命周期、事件開始運作:
◆preinitialize:application已經(jīng)實例化但尚未創(chuàng)建任何childcomponent
◆initialize:已經(jīng)創(chuàng)建childcomponent但對其進行布局(layout)
◆creationComplete:application已經(jīng)完成實例化并完成所有childcomponent的布局
SystemManager有一個topLevelSystemManager對象,指向一個SystemManager實例,是所有當(dāng)前在flashplayer運行的任何東西的根(root),如果flex被作為主應(yīng)用加載到flashplayer則上述屬性將指向其本身(self-refrencing),但當(dāng)flex應(yīng)用是被另一flex應(yīng)用載入的,其自身的SystmenManager的topLevelSystemManager屬性則不是自引用了,而是指向其父應(yīng)用的SystemManager實例。所有UIComponent的子類都有一個systemManager屬性指向應(yīng)用的SystemManager實例,在被SystemManger實例監(jiān)聽的component的事件發(fā)生冒泡時,其將擁有事件處理鏈上***的處理權(quán)。
2、Flashpalyer和Framwork的區(qū)別
Flashplayer是Flex應(yīng)用和flash應(yīng)用的運行環(huán)境,兩應(yīng)用對其擁有完全平等的操作權(quán)(通過Flashplayer提供的API),兩應(yīng)用形成的.swf文件在flashplayer中是同樣的表現(xiàn),不同的不是應(yīng)用的內(nèi)容而是其各自的創(chuàng)建方式。Flex的Framework在開發(fā)和運行之間為應(yīng)用提供了一層抽象,F(xiàn)lex應(yīng)用編譯時會將必要的framworklibrary編譯進.swf文件(同樣影響應(yīng)用文件的大小等),主要的flashplayerclass當(dāng)然不會被編譯到.swf中,因為他們已經(jīng)存在于flashplayer中了,最終形成與flash應(yīng)用同樣的flashplayer可以理解的指令。
關(guān)于flashplayerclass和flexframework的區(qū)分很方便,前者的class以flash開頭,如flash.net.URLLoader,而后者則以mx開頭,如mx.controls.Button
3、動態(tài)載入另外的flex應(yīng)用
<mx:SWFLoadersource=”src/*.swf”/>
Swfloader的content屬性指向被載入的flex應(yīng)用的SystemManager實例(其application屬性指向被載入felx應(yīng)用的Application實例),swfloader加載、初始化被載入flex應(yīng)用時會dispatch出init事件,可與其中監(jiān)聽被載入flex應(yīng)用的SystemManager實例的ApplicationComplete事件,事件發(fā)生時被載入content的Application對象方可以引用
與inithandler中event.target.content.addEventListener(FlexEvent.APPLICATION_COMPLETE,func);
與applicationCompleteHandler中event.target.application.method…
4、理解應(yīng)用程序域(applicationdomain)
一個應(yīng)用程序domain(類似于.net的appdoamin)中有flex應(yīng)用的相關(guān)類定義、資源等,被載入的新flex應(yīng)用可以存在于一個全新的、隔離的domain中(占額外的內(nèi)存資源)、可以存在于當(dāng)前domain的子doamin中(共享父domain的資源、類定義,須注意類定義被取代的情況)、也可以直接存在與當(dāng)前doamin中(同樣須注意類定義沖突),如runtimesharedlibrary。
代碼中實現(xiàn)這三種方式的應(yīng)用(主要應(yīng)用到flash.system.LoaderContext、flash.display.Loader或flash.net.URLLoader、flash.system.ApplicationDomain)
- varcontext:LoaderContext=newLoaderContext();
- context.applicationDomain=newApplicationDomain(ApplicationDomain.currentDomain);//載入作為子domain
- context.applicationDomain=newApplicationDomain();//載入作為全新domain
- context.applicationDomain=ApplicationDomain.currentDomain;//載入當(dāng)前domain
- varrequest:URLRequest=newURLRequest("RuntimeLoadingExample.swf");
- varloader:Loader=newLoader();
- loader.load(request,context);
5、關(guān)于preloader
Preloader是一個輕量級的類,在systemManager的***幀被實例化,preloader會dispatch出一系列的事件,由progressbar監(jiān)聽實現(xiàn)loading界面,一旦應(yīng)用進入第二幀待application初始化后會借由systemmanager通知preloader初始化進度,preloader通知systemmanager其準(zhǔn)備待刪除
Preloader的事件dispatch:
- progress
- Indicatesdownloadprogress
- complete
- Indicatesthatthedownloadiscomplete
- rslError
- Indicatesthataruntimesharedlibrarycouldnotload
- rslProgress
- Indicatesthedownloadprogressforaruntimesharedlibrary
- rslComplete
- Indicatesthatthedownloadiscompleteforruntimesharedlibraries
- initProgress
- Indicatesthattheapplicationisinitializing
- initComplete
- Indicatesthattheapplicationhasinitialized
如此,preloader可以定制化了。
【編輯推薦】
- 解析Flexbuilder4十大新特性
- 從Flex Builder更名看Flash平臺戰(zhàn)略
- Flex及FlexBuilder2.0開發(fā)環(huán)境詳解
- FlexBuilder3.0與Eclipse3.4的***結(jié)合
- 學(xué)習(xí)筆記 FlexBuilder2.0中如何使用基于Lists的控件