Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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 (что тоже, мягко говоря, маловероятно).

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

Старый 09.08.2012, 12:57
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
При первом вызове checkForInit функция прерывается раньше чем происходит отписывание от событий.
Цитата:
Код AS3:
if (!stage || !root.loaderInfo.width) {
	return;
}
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 10.08.2012, 12:00
BuKT вне форума Посмотреть профиль Отправить личное сообщение для BuKT Найти все сообщения от BuKT
  № 3  
Ответить с цитированием
BuKT
 
Аватар для BuKT

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
Цитата:
При первом вызове checkForInit функция прерывается раньше чем происходит отписывание от событий.
Разумеется. Если сцена ещё не инициализирована — инициализация самой флешки прерывается и дожидается следующего события
__________________
Дебаггер не предлагать

Старый 04.02.2015, 02:44
BuKT вне форума Посмотреть профиль Отправить личное сообщение для BuKT Найти все сообщения от BuKT
  № 4  
Ответить с цитированием
BuKT
 
Аватар для BuKT

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
Кстати, ошибка вроде была в том, что Event.COMPLETE, в отличие от мышиных событий, бабблятся сквозь sandbox лоадера.
__________________
Дебаггер не предлагать

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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