Aplikację należy podzielić na wiele plików SWF.
Urządzenia mobilne mogą mieć ograniczony dostęp do sieci. W celu szybkiego załadowania treści należy podzielić aplikację na wiele plików SWF. Należy dążyć do wielokrotnego używania fragmentów kodu i zasobów w całej aplikacji. Na przykład: rozważmy aplikację, która została podzielona na wiele plików SWF, co przedstawia poniższy diagram.
Aplikacja podzielona na wiele plików SWF
W tym przykładzie każdy plik SWF zawiera własną kopię tej samej bitmapy. Takiemu powielaniu można zapobiegać poprzez korzystanie z biblioteki RSL (Runtime Shared Library), co prezentuje poniższy diagram:
Użycie wspólnej biblioteki wykonawczej (RSL)
Gdy używana jest ta technika, biblioteka RSL zostaje załadowana w celu udostępnienia bitmapy innym plikom SWF. Klasa ApplicationDomain zawiera wszystkie definicje klas, które zostały załadowane, i udostępnia je w środowisku wykonawczym za pośrednictwem metody
getDefinition()
.
Biblioteka RSL może również zawierać całą logikę realizowaną przez kod. Cała aplikacja może zostać zaktualizowana w środowisku wykonawczym bez konieczności rekompilacji. Poniższy kod ładuje bibliotekę RSL i wyodrębnia definicję zawartą w pliku SWF w środowisku wykonawczym. Ta technika może być stosowana z czcionkami, bitmapami, dźwiękami lub dowolnymi klasami 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.");
}
Uzyskanie definicji może być łatwiejsze poprzez załadowanie definicji klasy w domenie aplikacji ładowanego pliku 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.");
}
Klasy dostępne w załadowanym pliku SWF mogą być używane poprzez wywołanie metody
getDefinition()
w bieżącej domenie aplikacji. Dostęp do klas można również uzyskać poprzez wywołanie metody
getDefinitionByName()
. Ta technika zmniejsza obciążenie łącz, ponieważ czcionki i duże zasoby są ładowane tylko raz. Zasoby nie są nigdy eksportowane w żadnych innych plikach SWF. Jedynym ograniczeniem jest to, że aplikacja musi zostać przetestowana i być uruchamiana za pośrednictwem pliku loader.swf. Ten plik najpierw ładuje zasoby, a następnie ładuje różne pliki SWF, które składają się na aplikację.