Показать сообщение отдельно
Старый 09.08.2012, 11:49
BuKT вне форума Посмотреть профиль Отправить личное сообщение для BuKT Найти все сообщения от BuKT
  № 1  
Ответить с цитированием
BuKT
 
Аватар для BuKT

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
По умолчанию Как правильно слушать события 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 (что тоже, мягко говоря, маловероятно).

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