Divida seu aplicativo em vários arquivos SWF.
Dispositivos móveis podem ter acesso limitado à rede. Para carregar seu conteúdo rapidamente, divida seu aplicativo em vários arquivos SWF. Tente reutilizar a lógica e os ativos de código em todo o aplicativo. Por exemplo, considere um aplicativo que tenha sido dividido em vários arquivos SWF, conforme mostrado no seguinte diagrama:
Aplicativo dividido em diversos arquivos SWF
Neste exemplo, cada arquivo SWF contém sua própria cópia do mesmo bitmap. Essa duplicação pode ser evitada pelo uso de uma biblioteca compartilhada no tempo de execução, como ilustrado no diagrama a seguir:
Utilizando uma biblioteca compartilhada de tempo de execução
Com o uso dessa tecnologia, uma biblioteca compartilhada em tempo real é carregada para disponibilizar o bitmap para os outros arquivos SWF. A classe ApplicationDomain armazena todas as definições de classe que tiverem sido carregadas e as disponibiliza no tempo de execução por meio do método
getDefinition()
.
Uma biblioteca compartilhada no tempo de execução também pode conter toda a lógica do código. Todo o aplicativo pode ser atualizado no tempo de execução, sem a necessidade de recompilação. O código a seguir carrega uma biblioteca compartilhada em tempo de execução e extrai a definição contida no arquivo SWF no tempo de execução. Essa técnica pode ser usada com fontes, bitmaps, sons ou qualquer 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.");
}
A obtenção da definição pode ser facilitada pelo carregamento das definições de classe no domínio do aplicativo do arquivo 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.");
}
Agora as classes disponíveis no arquivo SWF carregado podem ser usadas chamando-se o método
getDefinition()
no domínio do aplicativo atual. Também é possível acessar as classes chamando o método
getDefinitionByName()
. Essa técnica economiza largura de banda por carregar fontes e grandes ativos somente uma vez. Os ativos nunca são exportados em nenhum outro arquivo SWF. A única limitação é que o aplicativo precisa ser testado e executado por meio do arquivo loader.swf. Esse arquivo carrega os ativos primeiro e, em seguida, carrega os diferentes arquivos SWF que compõem o aplicativo.