|
|
|||||
Регистрация: Oct 2008
Сообщений: 14
|
Проблема с URLLoader!
Здравствуйте ув. форумчане!
Ситуация такая, существует класс подкюченный через Document root, в конструкторе мне необходимо получить данные из PHP скрипта, делаю есессно через URLLoader, но он работает только через addEventListener а функция указываемая при создании слушаетеля работает только после завершения конструктора. Вопрос! Как же мне получить мои данные в конструктор?? В функции которую вызывает слушатель пытаюсь сохранять в поля класса, но это смысла не имеет т.е. она отрабатывает позже конструктора. Прилагаю исходник, прошу сильно не бить =) это вообще первое что я пишу на AS. package hmain{ import flash.display.Sprite; import flash.text.TextField; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.URLLoaderDataFormat; import flash.events.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; public class Header extends Sprite { public var h_image:String; public var h_title:String; public var h_description:String; private var img_width:Number=140; public function Header() { var max_id:Number=20;//Максимальный ИД, получаем из ФлашВарс(!НЕ ЗАБЫТЬ) var len:Number=15;//Сколько нужно вывести фильмов(!БАГ: лента не растягивается дальше чем указано в мувике) var i:Number=max_id-len;//Расчет начального значения счетчика для цикла var lent:lenta=new lenta();//Мувки ленты var iter:Number=0;//счетчик итераций цикла, для построения ленты while (i<=max_id) {//Каждая итерация цикла запрашивает данные о фильме по его ИД var reque:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/datakeeper.php?id="+i); var loader:URLLoader=new URLLoader(); loader.dataFormat=URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, loadVars);//Добавляем слушателя, который скажет когда //переменные загружены !ВОТ ТОТ САМЫЙ ЛИСТЕНЕР try {//Если что либо не так то выводим сообщение об ошибке loader.load(reque); } catch (error:Error) { trace("Не могу загрузить: "+error); } var img_loader:Loader=new Loader();//Лоадер для загрузки картинки img_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadImgErr); var img_request:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/imagekeeper.php?id="+i); img_loader.load(img_request);//загрузка картинки var flm:film=new film(this.h_title, this.h_description, img_loader);//создаем мувик фильма и передаем ему картинку flm.x=this.img_width*iter;//рачсет координат мувика фильма lent.addChild(flm); iter++; img_loader=null; img_request=null; //Лоадер КОНЕЦ i++; reque=null; loader=null; } addChild(lent);//выводим ленту на экран } private function loadVars(ev:Event):void {//Реакция слушателя загрузки данных !ТА САМАЯ ФУНКЦИЯ var loader:URLLoader=URLLoader(ev.target); h_image=loader.data.h_image; h_title=loader.data.h_title;; h_description=loader.data.h_description; } private function loadImgErr(ev:IOErrorEvent):void { var txt:TextField=new TextField(); txt.width=400; txt.text="Cannot load IMAGE!"; addChild(txt); } } } |
|
|||||
Передать их через html параметр flashVars (или GET методом - работает только в сети) и распарить их в конструкторе (stage.loaderInfo.parameters)
Но лучше выполнить блок кода инициализации после загрузки всех данных. Рекомендую посмотреть http://code.google.com/p/bulk-loader/ - очень облегчает жизнь. import br.com.stimuli.loading.BulkLoader; var loader:BulkLoader = new BulkLoader("data-loader"); var numLoaded:int =0; while (i<=max_id) { loader.add(reque,{id:i}); //можно просто строку вместо реквеста loader.get(i).addEventListener(Event.COMPLETE, completeFunc); i++; } loader.start(); private function completeFunc(e:Event):void{ numLoaded++; if (numLoaded == len){ //здесь код //Чтобы получить объект с информацией var obj = loader.getSerializedData(id,convertStringToObject); } } private function convertStringToObject(val:String):Object{ //здесь парсим строку любого формата в объект например "parameter1=val1¶meter2=val2"; var obj:Object = {}; var _array:Array = val.split("&"); for(var i=0; i < _array.length; i++){ obj[_array[i].split["="][0]]=_array[i].split["="][1]; } return obj; } }
__________________
if (love is true) break my.heart; Последний раз редактировалось Rzer; 30.10.2008 в 00:10. |
|
|||||
Регистрация: Oct 2008
Сообщений: 14
|
Спасибо за помощь =) но я не стал прибегать с сторонним лоадерам а слегка извратился и все получилось, работает по такой логике:
1.Грузит из скрипта данные причем циклично т.к. данные зависят от передаваемой переменной 2.после отработки конструктора вызывается функция слушателя лоадера причем делает это 15 раз, кол-во вызовов равно кол-ву итераций цикла в конструкторе. Заполняет 3 массива данными. Когда видит что длинна массива стала равна переменной определяющей кол-во итераций цикла в конструкторе вызывает другую функцию(собственно в этом и заключается изврат на мой взгляд, был бы я разрабом флеша не стал бы делать столь дебильный загрузчик). 3.вызванная функиця уже грузит картинки опираясь на данные из массивов и строит изображение Вот исходник: package hmain{ import flash.display.Sprite; import flash.text.TextField; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.URLLoaderDataFormat; import flash.events.*; import flash.display.Bitmap; import flash.display.Loader; public class Header extends Sprite { //переменные для построения циклов private var lent:lenta=new lenta(); private var max_id:Number; private var start_id:Number; private var len:Number; //поля для данных о фильме private var film_title:Array=new Array(); private var film_description:Array=new Array(); private var film_image:Array=new Array(); public function Header() { this.max_id=20;//Получаем из flashVars this.len=15;//Сколько надо вывести фильмов this.start_id=this.max_id-this.len;//с какого ИД начинать вывод for (this.start_id; this.start_id<=this.max_id; this.start_id++) {//поцикленно получаем данные о фильме var req:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/datakeeper.php?id="+this.start_id); var ldr:URLLoader=new URLLoader(); ldr.dataFormat=URLLoaderDataFormat.VARIABLES; ldr.addEventListener(Event.COMPLETE, getData); try { ldr.load(req); } catch (error:Error) { trace("Can`t load data! "+error); } } } private function getData(ev:Event) { var ldr:URLLoader=URLLoader(ev.target); this.film_title.push(ldr.data.h_title); this.film_description.push(ldr.data.h_description); this.film_image.push(ldr.data.h_image); //trace(this.film_title.length+" == "+(this.len+1)+" "+this.film_title); if ((this.film_title.length)==(this.len+1)) { createFilm(); } } private function createFilm(){ var start_id:Number; for(start_id=0; start_id<=this.len; start_id++){ var img_request:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/imagekeeper.php?image="+this.film_image[start_id]); var img_loader:Loader=new Loader(); img_loader.load(img_request); var flm:film=new film(this.film_title[start_id], this.film_description[start_id], img_loader); flm.x=144*start_id; lent.addChild(flm); img_request=null; img_loader=null; } addChild(lent); } } } |
Часовой пояс GMT +4, время: 14:35. |
|
« Предыдущая тема | Следующая тема » |
|
|