Dividete l'applicazione in più file SWF.
I dispositivi mobili possono avere un accesso limitato alla rete. Per caricare rapidamente il vostro contenuto, dividete l'applicazione in più file SWF. Cercate di riutilizzare la logica del codice e le risorse in tutta l'applicazione. Ad esempio, considerate un'applicazione che è stata divisa in più file SWF, come quella raffigurata nel diagramma seguente:
Applicazione divisa in più file SWF
In questo esempio, ogni file SWF contiene una copia distinta della stessa bitmap. Questa duplicazione può essere evitata utilizzando una libreria condivisa in runtime, come illustrato dal diagramma seguente:
Utilizzando una libreria condivisa in runtime
In base a questa tecnica, una libreria condivisa in runtime viene caricata per rendere disponibile la bitmap agli altri file SWF. La classe ApplicationDomain include tutte le definizioni di classe che sono state caricate e le rende disponibili in runtime tramite il metodo
getDefinition()
.
Una libreria condivisa in runtime può anche contenere tutta la logica del codice. L'intera applicazione può così essere aggiornata in runtime senza che sia necessario ricompilarla. Il codice seguente carica una libreria condivisa in runtime ed estrae la definizione contenuta nel file SWF in fase di runtime. Questa tecnica può essere utilizzata con i font, le bitmap, i suoni o qualsiasi classe 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.");
}
Per facilitare l'estrazione della definizione, è possibile caricare le definizioni di classe nel dominio applicazione del file SWF che esegue il caricamento:
// 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.");
}
Ora le classi disponibili nel file SWF caricato possono essere utilizzate chiamando il metodo
getDefinition()
sul dominio applicazione corrente. Potete accedere alle classi anche chiamando il metodo
getDefinitionByName()
. Questa tecnica permette di risparmiare banda caricando i font e le risorse più grandi una sola volta. Le risorse non vengono mai esportate in altri file SWF. L'unica limitazione consiste nel fatto che l'applicazione deve essere testata ed eseguita mediante il file loader.swf. Questo file carica prima le risorse, quindi carica i vari file SWF che compongono l'applicazione.