Externe inhoud

Verdeel uw toepassing in meerdere SWF-bestanden.

Mobiele apparaten hebben mogelijk beperkte toegang tot het netwerk. Als u uw inhoud snel wilt laden, verdeelt u uw toepassing in meerdere SWF-bestanden. Probeer de codelogica en elementen opnieuw te gebruiken over de hele toepassing. Laat ons bijvoorbeeld even het volgende diagram bekijken waarbij een toepassing is verdeeld in meerdere SWF-bestanden.

Toepassing die is opgedeeld in meerdere SWF-bestanden

In dit voorbeeld bevat elk SWF-bestand zijn eigen kopie van dezelfde bitmap. Deze duplicatie kan worden vermeden door een bij uitvoering gedeelde bibliotheek te gebruiken, zoals wordt weergegeven in het volgende diagram:

Een gedeelde runtime-bibliotheek gebruiken

Als u deze techniek gebruikt, wordt een bij uitvoering gedeelde bibliotheek geladen om de bitmap beschikbaar te stellen voor andere SWF-bestanden. De ApplicationDomain-klasse slaat alle klassedefinities op die zijn geladen en stelt deze beschikbaar tijdens uitvoering via de getDefinition() -methode.

Een bij uitvoering gedeelde bibliotheek kan eveneens alle codelogica bevatten. De volledige toepassing kan worden bijgewerkt tijdens de uitvoering zonder dat deze opnieuw moet worden gecompileerd. De volgende code laadt een bij uitvoering gedeelde bibliotheek en extraheert de definitie die tijdens de uitvoering in het SWF-bestand zit. Deze techniek kan worden gebruikt met lettertypen, bitmaps, geluiden of elke ActionScript-klasse:

// 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."); 
}

Het ophalen van de definitie kan worden vereenvoudigd door de klassedefinities te laden in het toepassingsdomein van het geladen SWF-bestand:

// 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."); 
}

De klassen die beschikbaar zijn in het geladen SWF-bestand kunnen vervolgens worden gebruikt door de getDefinition() -methode aan te roepen op het huidige toepassingsdomein. U kunt ook toegang krijgen tot de klassen door de getDefinitionByName() -methode aan te roepen. Met deze techniek wordt bandbreedte bespaard door lettertypen en grote elementen slechts eenmaal te laden. Elementen worden nooit geëxporteerd naar andere SWF-bestanden. De enige beperking is dat de toepassing moet worden getest en door het loader.swf-bestand moet worden uitgevoerd. Dit bestand laadt eerst de elementen en vervolgens de verschillende SWF-bestanden waaruit de toepassing is samengesteld.