Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно слушать события loaderInfo? (http://www.flasher.ru/forum/showthread.php?t=183006)

BuKT 09.08.2012 11:49

Как правильно слушать события loaderInfo?
 
Изначальная идея проста - разрешить грузиться флешке не раньше, чем будут доступны все её свойства. Для этого слушаем добавление на холст и события loaderInfo:

Код AS3:

public class SomeDocumentClass extends Sprite{
        public function SomeDocumentClass() {
                this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                this.loaderInfo.addEventListener(Event.INIT, checkForInit);
                this.loaderInfo.addEventListener(Event.COMPLETE, checkForInit);
        }
 
        private function onAddedToStage(e:Event):void {
                stage.scaleMode = StageScaleMode.SHOW_ALL;
                checkForInit(e);
        }
 
        private function checkForInit(e:Event):void {
                if (e.type == Event.COMPLETE) {
                        trace(new Error().getStackTrace()); //Error at ru.flashader::SomeDocumentClass/checkForInit()[C:\path\to\project\ru\flashader\SomeDocumentClass.as:XX]
                }
                try {
                        if (!stage || !root.loaderInfo.width) {
                                return;
                        }
                } catch (e:Error) {
                        trace("checkForInit: " + e);
                        return;
                }
                this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                this.loaderInfo.removeEventListener(Event.INIT, checkForInit);
                this.loaderInfo.removeEventListener(Event.COMPLETE, checkForInit);
                init();
        }
 
        private function init():void {
                //Doings
        }
}

При этом, метод init() класса почему-то вызывается дважды. При этом второй раз поступающее в него событие имеет тип Event.COMPLETE. Как видно из кода выше в этом случае я прошу флешку показать мне стектрейс. В ответ на это мудрая и добрая флешка отвечает мне, что стектрейса нет и метод вызван сам по себе.

У меня только два предположения: или флеш научился работать в два потока (из-за чего событие COMPLETE встаёт в некую внутреннюю очередь чуть раньше, чем удаляется его хэндлер), или перед снятием слушателя события у флешки меняется loaderInfo (что тоже, мягко говоря, маловероятно).

Отвечу сразу: да, флаг поставить проще и проблему этим я уже решил. Вопрос в том, почему не работает именно вышеприведённый способ?

alatar 09.08.2012 12:57

При первом вызове checkForInit функция прерывается раньше чем происходит отписывание от событий.
Цитата:

Код AS3:

if (!stage || !root.loaderInfo.width) {
        return;
}



BuKT 10.08.2012 12:00

Цитата:

При первом вызове checkForInit функция прерывается раньше чем происходит отписывание от событий.
Разумеется. Если сцена ещё не инициализирована — инициализация самой флешки прерывается и дожидается следующего события

BuKT 04.02.2015 02:44

Кстати, ошибка вроде была в том, что Event.COMPLETE, в отличие от мышиных событий, бабблятся сквозь sandbox лоадера.


Часовой пояс GMT +4, время: 07:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.