Почему не загружается мой стандартный RSL? - PullRequest
0 голосов
/ 12 сентября 2011

Я создал модульное приложение, в котором родительский SWF-файл загружает ряд других SWF-файлов по требованию.Для оптимизации я создал стандартный RSL .

. Я скомпилировал общий код в SWC и перекомпилировал SWF-файлы приложения для ссылки на этот SWC, используя в своей сборке следующее.Задача xml ANT (для каждого swf в моем приложении):

<static-link-runtime-shared-libraries>false</static-link-runtime-shared-libraries>
<runtime-shared-library-path path-element="${lib.loc}/RSL.swc">
    <url rsl-url="RSL.swf"/>
</runtime-shared-library-path>

Я извлек RSL.swf из RSL.swc и поместил его на свой веб-сервер в тот же каталог, что и swfs приложения и html-файл контейнера..

Теперь, когда я загружаю свое приложение, я получаю сообщение:

VerifyError: Error #1014: Class mx.core:BitmapAsset could not be found.

Я вижу этот класс включенным в классы в RSL.swc / RSL.swf.

Я использовал fiddler, чтобы наблюдать за происходящим, и я вижу, что мой SWF-файл приложения загружен, но не делается попытка получить RSL.swf.

Установив файл Application.swf дляиспользовать RSL, я ожидал, что он попытается загрузить RSL.swf перед инициализацией, однако этого не происходит.Кто-нибудь может подсказать почему?

1 Ответ

0 голосов
/ 03 октября 2011

С http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_02.html:

"Нельзя использовать RSL в проектах только для ActionScript, если базовый класс - Sprite или MovieClip. Для RSL требуется, чтобы базовый класс приложения, такой как Application или SimpleApplication, понимал загрузку RSL."

Поскольку моим базовым классом был Sprite, у меня была эта ошибка.

В моем случае было лучше скомпилировать все необходимые классы в мой SWF-файл приложения, используя следующие шаги:

  1. использовать compc для создания SWC с файлами, которые я хочу включить в мой SWF-файл приложения
  2. использовать mxmlc с include-библиотеками, указывающими на файл SWC для включения.Создание отчета о связанных файлах (xml) с помощью link-report
  3. компилирует каждый дополнительный дочерний SWF-файл с load-externs, указывающими на отчет о связанных файлах (xml) - это исключает компиляцию файлов, связанных с Application.swfв каждый из дочерних swfs

Для выполнения шага 1:

<!-- We define the global classes which will be compiled into the parent Application   
     swf, but excluded from the tool swfs. As pure actionscript projects with base 
     class of Sprite can't usually use RSLs, we are forcing these classes to be loaded 
     into the parent application, and excluded from the child applications, allowing an 
     "Rsl-like" optimisation -->

<fileset id="rsl.inclusions" dir="${main.src.loc}">
    <include name="${main.src.loc}/path1/**/*.as"/>
    <include name="${main.src.loc}/path2/**/*.as"/>
    ...
</fileset> 

<pathconvert property="rsl.classes" pathsep=" " refid="rsl.inclusions">
<chainedmapper>
    <globmapper from="${main.src.loc}\*" to="*"/>
        <mapper type="package" from="*.as" to="*"/>
</chainedmapper> 
</pathconvert>

<!-- Compile SWC -->
<compc output="${lib.loc}/MySwc.swc" 
       include-classes="${rsl.classes}">
<static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>   
<source-path path-element="${main.src.loc}"/>
</compc>

Для выполнения шага 2:

<mxmlc file="${main.src.loc}/pathToApp/Application.as" 
   output="${bin.loc}/Application.swf" 
   debug="${debug}"
   use-network="true"
   link-report="WorkbenchLinkReport.xml"
   fork="true">
    <compiler.source-path path-element="${main.src.loc}" />
<static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
<include-libraries dir="${lib.loc}" append="true">
    <include name="MySwc.swc" />
</include-libraries>
</mxmlc> 

Для выполнения шага 3:

<mxmlc file="${main.src.loc}/pathToChildSwf1/Child1.as"      
       output="${bin.loc}/Child1.swf" 
       debug="${debug}" 
       load-externs="WorkbenchLinkReport.xml" 
       fork="true">
<compiler.source-path path-element="${main.src.loc}" />
<static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
<compiler.headless-server>true</compiler.headless-server>           
</mxmlc>

Еще один полезный совет: использование fork = "true" предотвращает нехватку памяти на виртуальной машине Java, где компилируется много swfs.

Надеюсь, это полезно!

...