PDA

Просмотр полной версии : SWFLoader, при повторной загрузке AVM1 теряются переменные запроса


incorp
30.10.2009, 21:32
Сразу к сути, вот код во флексовом приложении, оставил только то что показалось важным, этот код создает SWFLoader, и автолоадом подгружает приложение на as2, в переменных запроса идут инициализационные переменные для подгружаемого приложения.
private function doLoadComponent( component:ComponentBean, params:Object ) : void
{
component.setIsLoading( true );

loader = new SWFLoader();

loader_target = target;
target.addChild( loader );
component.setLevel( loader );
if(component.getName()!=loaded_name)
hideComponent( component.getName() );

var users_bean:String = "";
for each (var i:TableUserBean in users) users_bean += i.serializeForHttpReq();

var request:URLRequest = new URLRequest( component.getPath() + component.getName() +'.swf?v=' + getTimer() +
"&SFServer="+server+"&SFSPort="+String(port)+"&tempLog="+login+"&tempPas="+pass+"&gameName="+component.getName()+
"&table_room_id="+table_room_id+"&table_id="+table_id+"&place="+place+"&users="+users_bean);

if ( params ) request.data = params;
loader.addEventListener( Event.COMPLETE, onComponentLoaded );
loader.addEventListener( Event.UNLOAD, onUnloadComponent );
loader.source = request.url;
}
}

private function onUnloadComponent( event:* ) : void { trace("UNLOAD"); }

public function exitFromGame():void{ loader.unloadAndStop(true); }
А в чем же проблема? А проблема вот в чем - при первой подгрузке мы получаем наши переменные(все работает), при повторной в той же сессии - нет. При это я так и не смог для себя дать объяснение некоторым фактам, в клиентском приложении пишем:
static private var temp = 1;

private function set_init_variables()
{
trace("***Мы здесь были " + temp + " раз");
temp++;
}
в трейсах ловим:
***Мы здесь были 1 раз //все переменные появились в руте загруженого свф, как им и было сказано
UNLOAD // это анлоад зафиксирован во флексовом приложении
***Мы здесь были 2 раз //переменные в руте не определены, хотя запрос отработал, мы зашли в приложение.
Пока единственным объяснением я для себя вижу пятницу и опухший мозг к конецу недели, если у кого нибудь есть более здравые мысли - поделитесь. Премного благодарен:)
Да, забыл уточнить exitFromGame() вызывается по нажатии кнопки через локал конекшн в ас2 приложении.

wvxvw
30.10.2009, 21:41
Коннекш нужно обязательно закрывать перед выходом, иначе ничего не выгрузится.

incorp
31.10.2009, 14:24
на стороне флексового приложения я пробовал закрыть локал коннекшн, использовал команду close(). никакой разницы в результате не было, тем более что срабавтывает событие Event.UNLOAD - значит по идее выгрузка как бы произошла.

wvxvw
01.11.2009, 02:20
Не, событие вообще ни о чем не говорит. Когда Loader вызывает unload() он просто удаляет чилда из списка отображения, но если сообщение не закрыто "до конца", то чилд так и зависнет в памяти.
Но, есть еще и такое подозрение, что SWFLoader может отыскивать таких "потеряных детей", и потом их загружать повторно, если они вдруг обнаружаться после выгрузки. Я в его код не смотрел, но например загрузчик модулей так работает.

incorp
02.11.2009, 01:20
Да, это похоже на правду, я вобщем тоже думал в этом направлении. Но как же с этим бороться, хотя бы теоретически? я так понимаю команду "абсолютно полный анлоад" я вряд ли найду :)

wvxvw
02.11.2009, 01:46
Ну так только общие пожелания - поищите, может где-то в AS3 осталась необнуленная ссылка / неубитый слушатель привязаный к этому ребенку... Но вообще, иногда бывает впринципе невозможно выгрузить чужую флешку... особенное если там какие-нибудь setInterval'ы крутятся, тот же ЛК и тому подобные...

incorp
02.11.2009, 12:50
ок, спасибо, будем искать..