外部內容

將應用程式分為多個 SWF 檔案。

行動裝置可能只能存取受限的網路。若要快速載入您的內容,請將應用程式分成多個 SWF 檔案。請嘗試重複使用整個應用程式的程式碼邏輯與資源。例如,假設應用程式已經分為多個 SWF 檔案,如下圖所示:

將應用程式分割成多個 SWF 檔案

在這個範例中,每個 SWF 檔案都會包含其相同點陣圖的副本。若要避免這項重複,可以使用執行階段共享元件庫,如下圖所說明:

使用執行階段共享元件庫

使用這項技術時,會載入執行階段共享元件庫,以便將點陣圖提供給其他 SWF 檔案使用。ApplicationDomain 類別會儲存所有已載入的類別定義,並透過 getDefinition() 方法讓它們在執行階段可供使用。

執行階段共享元件庫也可以包含所有的程式碼邏輯。整個應用程式可以在執行階段更新,而不需重新編譯。下列程式碼會載入執行階段共享元件庫,並在執行階段擷取包含在 SWF 檔案中的定義。這項技術可與字型、點陣圖、音效或任何 ActionScript 類別搭配使用。

// Create a Loader object 
var loader:Loader = new Loader(); 
  
// Listen to the Event.COMPLETE event 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingComplete ); 
  
// Load the SWF file 
loader.load(new URLRequest("library.swf") ); 
var classDefinition:String = "Logo"; 
  
function loadingComplete(e:Event ):void 
{ 
    var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target ); 
     
    // Get a reference to the loaded SWF file application domain 
    var appDomain:ApplicationDomain = objectLoaderInfo.applicationDomain;     
  
    // Check whether the definition is available 
    if ( appDomain.hasDefinition(classDefinition) ) 
    {     
        // Extract definition 
        var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) ); 
  
        // Instantiate logo 
        var instanceLogo:BitmapData = new importLogo(0,0); 
  
        // Add it to the display list 
        addChild ( new Bitmap ( instanceLogo ) ); 
    } else trace ("The class definition " +  classDefinition + " is not available."); 
}

取得定義的更簡單方法,是在載入 SWF 檔案的應用程式網域中載入類別定義:

// Create a Loader object 
var loader:Loader = new Loader(); 
  
// Listen to the Event.COMPLETE event 
loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, loadingComplete ); 
  
// Load the SWF file 
loader.load ( new URLRequest ("rsl.swf"), new LoaderContext ( false, ApplicationDomain.currentDomain) ); 
var classDefinition:String = "Logo"; 
  
function loadingComplete ( e:Event ):void 
{ 
    var objectLoaderInfo:LoaderInfo = LoaderInfo ( e.target ); 
     
    // Get a reference to the current SWF file application domain 
    var appDomain:ApplicationDomain = ApplicationDomain.currentDomain;     
  
    // Check whether the definition is available 
    if (appDomain.hasDefinition( classDefinition ) ) 
    {     
        // Extract definition 
        var importLogo:Class = Class ( appDomain.getDefinition(classDefinition) ); 
  
        // Instantiate it 
        var instanceLogo:BitmapData = new importLogo(0,0); 
  
        // Add it to the display list 
        addChild ( new Bitmap ( instanceLogo ) ); 
    } else trace ("The class definition " +  classDefinition + " is not available."); 
}

現在可以呼叫目前應用程式網域上的 getDefinition() 方法,來使用載入的 SWF 檔案中的可用類別。您也可以呼叫 getDefinitionByName() 方法來存取類別。這項技術透過只載入字型與大型資源一次,以節省頻寬。在任何其他的 SWF 檔案中絕不會匯出資源。唯一的限制是必須測試應用程式,並透過 loader.swf 檔案來執行。這個檔案會先載入資源,然後載入撰寫該應用程式的不同 SWF 檔案。