Изначальная идея проста - разрешить грузиться флешке не раньше, чем будут доступны все её свойства. Для этого слушаем добавление на холст и события 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 (что тоже, мягко говоря, маловероятно).
Отвечу сразу: да, флаг поставить проще и проблему этим я уже решил. Вопрос в том, почему не работает именно вышеприведённый способ?