Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Путаются флешки с ассетами, загруженными BulkLoader-ом (http://www.flasher.ru/forum/showthread.php?t=177962)

mishgun_ 12.04.2012 09:03

Путаются флешки с ассетами, загруженными 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-ку из винды - с каждым кликом мальчик/девочка чередуются, т.е. все происходит как и задумывалось.
Подскажите, пожалуйста, в чем может быть проблема? Контролирует ли как-то вконтакт подгружаемые флешки? Может быть как-то кэш браузера влияет?

Спасибо.

maxkar 12.04.2012 11:09

В какой Application Domain грузятся ваши флешки (кторые BulkLoader грузит)?

mishgun_ 12.04.2012 12:38

Цитата:

Сообщение от maxkar (Сообщение 1074589)
В какой 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;
}


maxkar 12.04.2012 13:05

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

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

mishgun_ 12.04.2012 13:11

т.е. для каждой загружаемой флешки следует задать свой 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();

как-то так?

maxkar 12.04.2012 13:34

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

mishgun_ 12.04.2012 13:53

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

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

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

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


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

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