Загрузка модуля завершается неудачно при первом вызове load (), но после - PullRequest
1 голос
/ 20 июля 2011

У меня есть кнопка, которая при нажатии загружает модуль Flex в мое приложение AIR.Тем не менее, иногда модуль не загружается при первом нажатии кнопки, но работает при втором нажатии.Когда я отлаживаю его в отладчике, событие READY не запускается, поэтому оставшаяся логика никогда не вызывается.

var moduleInfo:IModuleInfo = ModuleManager.getModule(managedModule.url);
moduleInfo.addEventListener(ModuleEvent.READY, function(event:ModuleEvent):void {
    trace("ModuleEvent.READY called.");
});
moduleInfo.addEventListener(ModuleEvent.ERROR, function(event:ModuleEvent):void {
    trace("ModuleEvent.ERROR called.");
});
moduleInfo.addEventListener(ModuleEvent.SETUP, function(event:ModuleEvent):void {
    trace("ModuleEvent.SETUP called.");
});
moduleInfo.addEventListener(ModuleEvent.PROGRESS, function(event:ModuleEvent):void {
    trace("ModuleEvent.PROGRESS called.");
});
moduleInfo.addEventListener(ModuleEvent.UNLOAD, function(event:ModuleEvent):void {
    trace("ModuleEvent.UNLOAD called.");
});
moduleInfo.load(ApplicationDomain.currentDomain);

ApplicationDomain.currentDomain необходим для исправления других проблем, но наличие или удаление его не вызываеткажется, не имеет значения.Иногда модули просто не загружаются.Вывод примерно такой:

[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.PROGRESS вызван.[SWF] MyStupidModule.swf - 342 932 байта после распаковки [trace] ModuleEvent.SETUP вызван.[trace] ModuleEvent.PROGRESS вызывается.

Обратите внимание, что READY никогда не вызывается и не является ошибкой.Если я нажму кнопку еще раз, вот что распечатывается:

[trace] ModuleEvent.SETUP вызывается.[trace] ModuleEvent.PROGRESS вызван.[trace] ModuleEvent.READY вызывается.

Есть какие-нибудь подсказки, что может быть причиной этого?Мы используем Flex 3.6.0 AIR 2.6.019

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Сохраните ссылку где-нибудь в классе владельца на ModuleInfoProxy (IModuleInfo) - экземпляр, который ModuleManager.getModule () возвращает для вас, например

class MyMainClass
{
           private var moduleInfo:IModuleInfo;
           public function load():void
           {
                 moduleInfo = ModuleManager.getModule("SimpleModule.swf");
                 ...
           }    
}

ModuleInfoProxy использует события со слабыми ссылками, и GC может полностью удалить его с помощью обработчиков событий, если у объекта больше нет ссылок на него. Хранение ссылки на IModuleInfo в локальной переменной делает этот объект пригодным для GC после выхода из метода load (). Если это произойдет до полной загрузки модуля, ваши слушатели не будут перезванивать.

1 голос
/ 20 июля 2011

Это была настоящая ошибка, которая была исправлена ​​в SDK

http://bugs.adobe.com/jira/browse/SDK-14669

Попробуйте обновить до самого последнего совместимого SDK, и вы должны быть настроены. Это должно быть исправлено в SDK, который вы перечислили, но не повредит.

Если это не сработает для вас, я помогу вам выработать работу.

Хорошие новости - вы не сумасшедший, это ошибка в фреймворке.

=)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...