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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.04.2012, 09:03
mishgun_ вне форума Посмотреть профиль Отправить личное сообщение для mishgun_ Найти все сообщения от mishgun_
  № 1  
Ответить с цитированием
mishgun_

Регистрация: Jun 2011
Сообщений: 12
По умолчанию Путаются флешки с ассетами, загруженными BulkLoader-ом

Здравствуйте.

Разрабатывая приложение для вконтакта, неожиданно наткнулся на странную багу и никак не могу понять в чем причина. Прошу прощения, если создал тему не в том разделе, но мне кажется, к API вконтакта она не относится.

Суть в следующем: у меня есть несколько swf-ок с ассетами, которые я загружаю со своего сервера при старте приложения. Для загрузки и управления используется BulkLoader. Для упрощения понимания, обозначим загружаемые флешки так:
Код AS3:
_loader.add(_uri1.toString(), { id: "asset1", context: _LdrContext });
_loader.add(_uri2.toString(), { id: "asset2", context: _LdrContext });
_loader.addEventListener(BulkLoader.COMPLETE, _assets_complete_func);
_loader.addEventListener(BulkLoader.ERROR, _assets_error_func);
_loader.addEventListener(BulkLoader.PROGRESS, _assets_progress_func);
_loader.start();
На самом деле, процесс загрузки более сложный, но не в нем суть. Т.к. сами по себе ассеты загружаются правильно и четко.
Доступ к конкретным ассетам организован так:
Код AS3:
	public function getAssetClass(asset_id:String, class_name:String):Class {
	var res:Object = _loader.getContent(asset_id);
	if(res) {
		try {
			var cl:Class = res.loaderInfo.applicationDomain.getDefinition(class_name) as Class;
		} catch(e) {
			return null;
		}
	 	return cl;
	} else {
		return null;
	}
}
public function createAssetSprite(assetCollection:String, assetClassName:String):Sprite {
	var assetClass:Class = getAssetClass(assetCollection, assetClassName);
	var art:Sprite = null;
	if(!assetClass) {
		var noimg = ((new NoImage()) as Sprite);
	} else {
		var bmp:Bitmap = new assetClass() as Bitmap;
		art = new Sprite();
		art.addChild(bmp);
	}
	return art;
}
Внутри приложения обращаюсь к ассетам:
Код AS3:
	_currentImage = _assetManager.createAssetSprite(asset_id, image_id);
И, собственно, в чем проблема: запуская приложение из вконтакта, вне зависимости какой asset_id я передаю в метод createAssetSprite, результирующий спрайт всегда берется из одной и той же флешки.
Поясню на примере: asset1 - это набор аватаров для мальчиков, asset2 - аватары для девочек, кликая на кнопку юзер выбирает свой пол. Так вот из вконтакта показываются либо только мальчики, либо только девочки. Когда запускаю то же самое приложение из CS5.5 или просто swf-ку из винды - с каждым кликом мальчик/девочка чередуются, т.е. все происходит как и задумывалось.
Подскажите, пожалуйста, в чем может быть проблема? Контролирует ли как-то вконтакт подгружаемые флешки? Может быть как-то кэш браузера влияет?

Спасибо.

Старый 12.04.2012, 11:09
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
В какой Application Domain грузятся ваши флешки (кторые BulkLoader грузит)?

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

Регистрация: Jun 2011
Сообщений: 12
Цитата:
Сообщение от maxkar Посмотреть сообщение
В какой Application Domain грузятся ваши флешки (кторые BulkLoader грузит)?
видимо, Application Domain задается LoaderContext-ом?


вот с таким LoaderContext я инициализирую BulkLoader
Код AS3:
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
if (Security.sandboxType != "localTrusted") {
	loaderContext.securityDomain = SecurityDomain.currentDomain;
}

Старый 12.04.2012, 13:05
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 4  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Угу. Вы загружаете все в один и тот же application domain. В одном appdomain'е вы не можете иметь несколько классов с одним и тем же именем. Если вы попытаетесь загрузить несколько классов, везде будет использован тот, который загружен первым. Грузите каждую флешку в новый (дочерний) ApplicationDomain. Каждую - в свой!

Локально работает потому, что вы локально загружаете в другой security sandobox (и, соотвтетсвенно, в другой application domain).

Старый 12.04.2012, 13:11
mishgun_ вне форума Посмотреть профиль Отправить личное сообщение для mishgun_ Найти все сообщения от mishgun_
  № 5  
Ответить с цитированием
mishgun_

Регистрация: Jun 2011
Сообщений: 12
т.е. для каждой загружаемой флешки следует задать свой loaderContext?
Код AS3:
_loader.add(_uri1.toString(), { id: "asset1", context: new LoaderContext(false, new ApplicationDomain()) });
_loader.add(_uri2.toString(), { id: "asset2", context: new LoaderContext(false, new ApplicationDomain()) });
_loader.addEventListener(BulkLoader.COMPLETE, _assets_complete_func);
_loader.addEventListener(BulkLoader.ERROR, _assets_error_func);
_loader.addEventListener(BulkLoader.PROGRESS, _assets_progress_func);
_loader.start();
как-то так?

Старый 12.04.2012, 13:34
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 6  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Да. Возможно, в каждом случае еще и SecurityDomain нужно будет указывать. Это зависит от того, как флешки друг с другом взаимодействуют.

Старый 12.04.2012, 13:53
mishgun_ вне форума Посмотреть профиль Отправить личное сообщение для mishgun_ Найти все сообщения от mishgun_
  № 7  
Ответить с цитированием
mishgun_

Регистрация: Jun 2011
Сообщений: 12
взаимодействие у них такое: есть основная флешка, она загружает кучку мелких с картинками, по вышеупомянутой схеме делает из картинок спрайты и отображает

Добавлено через 2 часа 58 минут
не подскажете, где можно популярно почитать о связке Application/Security domain?
как это все работает и как их использовать?

Добавлено через 18 часов 46 минут
ну вроде бы все решилось
ApplicationDomain для каждой загружаемой флешки новый, с родителем - currentDomain
SecurityDomain у всех один - currentDomain

maxkar, еще раз спасибо за наводку

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

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

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


 


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


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