Внешнее содержимое

Разделите приложение на несколько 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-файлы, из которых состоит приложение.