Усовершенствованная ActionScript и Flex RSLs Проблема загрузки с механизмом начальной загрузки

Я хотел бы сначала дать краткий обзор моей ситуации.

У меня 2 разных проекта

  1. Actionscript AIR Project в FlashBuilder (приложение для настольных компьютеров)
  2. Проект Flex в FlashBuilder (работает в браузере)

Actionscript AIR Project (настольное приложение)

Приложение Desktop - это загрузочный контейнер, в котором есть встроенный SWF-файл второго проекта Flex. Этот SWF-файл будет загружен во время выполнения динамически и добавлен в DisplayList.

Flex Project

Приложение Web Flex - это контейнер, в котором будет загружено много дополнительных приложений. Важной частью этого контейнера является то, что Framework Linkage настроен на Runtime shared library (RSL). Это означает, что файлы Flex SWZ будут загружены при первой динамической загрузке этого встроенного SWF во время основного приложения AIR.

РЕЖИМ ОТЛАДКИ ЗАГРУЗКА SWF

Когда я запускаю приложение Air Desktop для контейнера DEBUG со встроенным SWF-файлом проекта Flex, скомпилированного для DEBUG, проблем не возникает.

Я получаю этот консольный журнал:

[SWF] Main.swf - 703,897 bytes after decompression **(Bootstrapper)**
[SWF] Main.swf/[[DYNAMIC]]/1 - 92,055 bytes after decompression **(Flex container)**
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/2 - 404,624 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/3 - 381,334 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/4 - 671,197 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/5 - 686,562 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/6 - 1,110,951 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/7 - 190,872 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/8 - 263,388 bytes after decompression
[SWF] Main.swf/[[DYNAMIC]]/1/[[DYNAMIC]]/9 - 292,059 bytes after decompression

РЕЖИМ ОТЛАДКИ с загрузкой SWF-версии

Когда я отлаживаю приложение Air Desktop контейнера со встроенным SWF-файлом проекта Flex, скомпилированного для RELEASE, возникает проблема.

[SWF] Main.swf - 703,897 bytes after decompression **(Bootstrapper)**
[SWF] Main.swf/[[DYNAMIC]]/1 - 92,055 bytes after decompression **(Flex container)**
VerifyError: Error #1014: Class spark.components::Application could not be found.

КАК ИСПРАВИТЬ ВТОРОЙ ЧАСТЬ?

Поскольку предполагается, что RELEASE SWF загружает файл RLS spark_4.5.0.21746.swz, он не должен отображать ошибку, поскольку класс spark.components::Application сам по себе.

Я пропускаю здесь некоторую опцию компилятора, которая позволила бы компилятору сначала загрузить RSL, а затем принять во внимание, что spark.components::Application уже находится в одном из загруженных RLS.

Actionscript AIR Project (приложение для настольных компьютеров) Пример кода начальной загрузки

Bootstraper был построен с использованием этого примера, взятого с веб-сайта документации Adobe:

https://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f06.html

package {

import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;

/**
 *  Classes used by the networking protocols go here. These are the classes
 *  whose definitions are added to the bootstrap loader and then shared
 *  by the main application and all sub-applications.
 */
import mx.messaging.config.ConfigMap; ConfigMap;
import mx.messaging.messages.AcknowledgeMessage; AcknowledgeMessage;
import mx.messaging.messages.AcknowledgeMessageExt; AcknowledgeMessageExt;
import mx.messaging.messages.AsyncMessage; AsyncMessage;
import mx.messaging.messages.AsyncMessageExt; AsyncMessageExt;
import mx.messaging.messages.CommandMessage; CommandMessage;
import mx.messaging.messages.CommandMessageExt; CommandMessageExt;
import mx.messaging.messages.ErrorMessage; ErrorMessage;
import mx.messaging.messages.HTTPRequestMessage; HTTPRequestMessage;
import mx.messaging.messages.MessagePerformanceInfo; MessagePerformanceInfo;
import mx.messaging.messages.RemotingMessage; RemotingMessage;
import mx.messaging.messages.SOAPMessage; SOAPMessage;
import mx.messaging.channels.HTTPChannel; HTTPChannel;
import mx.core.mx_internal;

[SWF(width="600", height="700")]
public class RPCBootstrapLoader extends Sprite {
        /**
         *  The URL of the application SWF that this bootstrap loader loads.
         */
        private static const applicationURL:String = "MainApp.swf";

        /**
         *  Constructor.
         */
        public function RPCBootstrapLoader() {
                super();

                if (ApplicationDomain.currentDomain.hasDefinition("mx.core::UIComponent"))
                        throw new Error("UIComponent should not be in the bootstrap loader.");

                stage.scaleMode = StageScaleMode.NO_SCALE;
                stage.align = StageAlign.TOP_LEFT;

                if (!stage)
                        isStageRoot = false;

                root.loaderInfo.addEventListener(Event.INIT, initHandler);
        }

        /**
         *  The Loader that loads the main application's SWF file.
         */
        private var loader:Loader;

        /**
         *  Whether the bootstrap loader is at the stage root or not.
         *  It is only the stage root if it was the root
         *  of the first SWF file that was loaded by Flash Player.
         *  Otherwise, it could be a top-level application but not stage root
         *  if it was loaded by some other non-Flex shell or is sandboxed.
         */
        private var isStageRoot:Boolean = true;

        /**
         *  Called when the bootstrap loader's SWF file has been loaded.
         *  Starts loading the application SWF specified by the applicationURL property.
         */
        private function initHandler(event:Event):void {
                loader = new Loader();
                addChild(loader);
                loader.load(new URLRequest(applicationURL));
                loader.addEventListener("mx.managers.SystemManager.isBootstrapRoot", 
                        bootstrapRootHandler);
                loader.addEventListener("mx.managers.SystemManager.isStageRoot", 
                        stageRootHandler);

                stage.addEventListener(Event.RESIZE, resizeHandler);
        }

        private function bootstrapRootHandler(event:Event):void {
                // Cancel event to indicate that the message was heard.
                event.preventDefault();
        }

        private function stageRootHandler(event:Event):void {
                // Cancel event to indicate that the message was heard.
                if (!isStageRoot)
                        event.preventDefault();
        }

        private function resizeHandler(event:Event):void {
                loader.width = stage.width;
                loader.height = stage.height;
                Object(loader.content).setActualSize(stage.width, stage.height);
        }
}

}

0 ответов

Другие вопросы по тегам