外部コンテンツ

アプリケーションを複数の 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."); 
}

これで、ロード済みの SWF ファイルに含まれているクラスは、現在のアプリケーションドメインで getDefinition() メソッドを呼び出すことにより使用できます。 getDefinitionByName() メソッドを呼び出しても、これらのクラスにアクセスできます。この方法では、フォントおよびサイズの大きいアセットを一度ロードするだけで済むので、帯域幅を節約できます。アセットが他の SWF ファイルに書き出されることはありません。唯一の制約は、loader.swf ファイルを使用してアプリケーションをテストおよび実行する必要があるという点です。このファイルは、最初にアセットをロードしてから、アプリケーションを構成している別の SWF ファイルをロードします。