Actionscript 3.0 的應用程序域 ApplicationDomain

       ApplicationDomain 類的用途是存儲 ActionScript 3.0 定義表。SWF 文件中的所有代碼被定義爲存在於應用程序域中。可以使用應用程序域劃分位於同一個安全域中的類。這允許同一個類存在多個定義,並且還允許子級重用父級定義。

       在使用 Loader 類 API 加載用 ActionScript 3.0 編寫的外部 SWF 文件時,可以使用應用程序域。(請注意,在加載圖像或用 ActionScript 1.0 或 ActionScript 2.0 編寫的 SWF 文件時不能使用應用程序域。)包含在已加載類中的所有 ActionScript 3.0 定義都存儲在應用程序域中。加載 SWF 文件時,通過將 LoaderContext 對象的 applicationDomain 參數設置爲ApplicationDomain.currentDomain,可以指定文件包含在 Loader 對象所在的相同應用程序域中。通過將加載的 SWF 文件放在同一個應用程序域中,可以直接訪問它的類。如果加載的 SWF 文件包含嵌入的媒體(可通過其關聯的類名稱訪問),或者您要訪問加載的 SWF 文件的方法,則這種方式會很有用,如下面的示例所示:

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.URLRequest; 
    import flash.system.ApplicationDomain; 
    import flash.system.LoaderContext; 
 
    public class ApplicationDomainExample extends Sprite 
    { 
        private var ldr:Loader; 
        public function ApplicationDomainExample() 
        { 
            ldr = new Loader(); 
            var req:URLRequest = new URLRequest("Greeter.swf"); 
            var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
            ldr.load(req, ldrContext);     
        } 
        private function completeHandler(event:Event):void 
        { 
            ApplicationDomain.currentDomain.getDefinition("Greeter"); 
            var myGreeter:Greeter = Greeter(event.target.content); 
            var message:String = myGreeter.welcome("Tommy"); 
            trace(message); // Hello, Tommy 
        } 
    } 
}

使用應用程序域時,還要記住以下幾點:

SWF 文件中的所有代碼被定義爲存在於應用程序域中。主應用程序在“當前域”中運行。“系統域”中包含所有應用程序域(包括當前域),也就是包含所有 Flash Player 類。

所有應用程序域(除系統域外)都有關聯的父域。主應用程序的應用程序域的父域是系統域。已加載的類僅在其父級中沒有相關定義時才進行定義。不能用較新的定義覆蓋已加載類的定義。

下圖顯示了某個應用程序在單個域 (domain1.com) 中加載多個 SWF 文件的內容。根據加載內容的不同,可以使用不同的應用程序域。緊跟的文本說明用於爲應用程序中的每個 SWF 文件設置適當應用程序域的邏輯。

A. 用法 A          B. 用法 B           C. 用法 C


主應用程序文件爲 application1.swf。它包含從其它 SWF 文件加載內容的 Loader 對象。在此方案下,當前域爲 Application domain 1。用法 A、用法 B 和用法 C 說明了爲應用程序中的每個 SWF 文件設置適當應用程序域的不同方法。

 

用法 A:  通過創建系統域的子級劃分子級 SWF 文件。在示意圖中,Application domain 2 創建爲系統域的子級。application2.swf 文件在 Application domain 2 中加載,因此其類定義從 application1.swf 中定義的類中劃分出來。

此方法的一個用處是使舊版應用程序能夠動態加載相同應用程序的更新版本,而不會發生衝突。之所以不發生衝突,是因爲儘管使用的是同樣的類名稱,但它們劃分到不同的應用程序域中。

下面的代碼創建作爲系統域子級的一個應用程序域,並使用該應用程序域開始加載一個 SWF:

var appDomainA:ApplicationDomain = new ApplicationDomain(); 

var contextA:LoaderContext = new LoaderContext(false, appDomainA); 

var loaderA:Loader = new Loader(); 

loaderA.load(new URLRequest("application2.swf"), contextA);

 

用法 B: 在當前類定義中添加新的類定義。module1.swf 的應用程序域設置爲當前域 (Application domain 1)。這可讓您將新的類定義添加到應用程序當前的一組類定義中。這可用於主應用程序的運行時共享庫。加載的 SWF 被視爲遠程共享庫 (RSL)。使用此方法可以在應用程序啓動之前使用預加載器加載 RSL。

下面的代碼加載一個 SWF,同時將其應用程序域設置爲當前域:

var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain; 

var contextB:LoaderContext = new LoaderContext(false, appDomainB); 

var loaderB:Loader = new Loader(); 

loaderB.load(new URLRequest("module1.swf"), contextB);

 

用法 C: 通過創建當前域的新子域,使用父級的類定義。module3.swf 的應用程序域是當前域的子級,並且子級使用所有類的父級的版本。此方法的一個用處可能是作爲一個使用主應用程序的類型的多屏幕豐富 Internet 應用程序 (RIA) 模塊,該模塊作爲主應用程序的子級加載。如果能夠確保所有類始終更新爲向後兼容,並且正在加載的應用程序始終比其加載的軟件的版本新,則子級將使用父級版本。如果可以確保不繼續擁有對子級 SWF 的引用,則擁有了新的應用程序域還使您能夠卸載所有的類定義以便於垃圾回收。

此方法使加載的模塊可以共享加載者的 singleton 對象和靜態類成員。

下面的代碼創建當前域的一個新子域,並使用該應用程序域開始加載一個 SWF:

var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 

var contextC:LoaderContext = new LoaderContext(false, appDomainC); 

var loaderC:Loader = new Loader(); 

loaderC.load(new URLRequest("module3.swf"), contextC);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章