|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
|
Срабатывание обработчика события там, где он срабатывать не должен
В классе А регистрируем обработчик для события
private function func():void { mapLoader = new Loader(); mapLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, mapComplete); mapLoader.load(new URLRequest(url)); } private function mapComplete(e:Event):void { trace("do something"); } private function BEnterFrame(e:Event):void { trace("начало"); mc.nextFrame(); trace("конец"); } Результат получается такой: trace("начало"); trace("do something"); trace("конец"); Понять не могу, каким это способом nextFrame() генерирует событие Event.COMPLETE у mapLoader.contentLoaderInfo Добавлено через 1 час 31 минуту Можно даже все немного упростить. Вот весь код package { import flash.display.Loader; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; public class Main extends Sprite { private var loader:Loader; private var mc:MovieClip; public function Main():void { trace("entry point"); loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); loader.load(new URLRequest("road.swf")); mc = new MovieClip(); mc.addEventListener(Event.ENTER_FRAME, onEnterFrameListener); } private function onComplete(e:Event):void { trace("onComplete"); loader.removeEventListener(Event.COMPLETE, onComplete); } private function onEnterFrameListener(e:Event):void { trace("onEnterFrameListener: start"); mc.nextFrame();//prevFrame(); gotoAndStop(); gotoAndPlay(); trace("onEnterFrameListener: end"); } } } ... onEnterFrameListener: start onComplete onEnterFrameListener: end ... |
|
|||||
А почему вы думаете, что команда mc.nextFrame() вызывает событие onComplete у лоадера? Так как загрузка асинхронная, то просто событие onComplete срабатывает между start и end в ентерФрейме, я так думаю.
|
|
|||||
Для успокоения души советую прикрепить последний пример к fla-файлу как Document Class и воспользоваться во время теста ролика флешовой фишкой [Simulate Download]. Тогда на низких скоростях соединения (настройка скорости имитации соединения - [Download Settings]) вы увидете когда вам в трейс попадет "onComplete"
Последний раз редактировалось iNils; 13.05.2012 в 15:06. |
|
|||||
Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
|
elder_Nosferatu, ответ подразумевает, что выполнение скрипта может прерываться. А это противоречит условиям работы платформы. Скрипт не может быть прерван, и не может выполняться параллельно, флеш однопоточен, по крайней мере пока
Добавлено через 7 минут К томуже, если на место mc.nextFrame(); поставить все что угодно, кроме prevFrame(); gotoAndStop(); или gotoAndPlay(); то все будет вылоняться так, как это должно быть. Тоесть результат ВСЕГДА будет такой: ... onEnterFrameListener: start onEnterFrameListener: end onComplete ... даже если на место nexFrame поставить var j:Number=0; for(var i:int=0;i<100000000;i++) { j+=Math.sqrt(i); } Этот скрипт выполняется несколько секунд, однако, результат всегда будет правильный. Из тех соображений что: 1)Выполнение скрипта прерываться не может 2)onComplete вызывается только, если написать функции: nextFrame(); prevFrame(); gotoAndStop() gotoAndPlay(); Я пришел к выводу, что onComplete вызывается из nextFrame();//prevFrame(); gotoAndStop() gotoAndPlay(); Последний раз редактировалось Maestro13; 13.05.2012 в 13:41. |
|
|||||
Наверное функция nextFrame включает следующий цикл перерисовки экрана, а Event.COMPLETE вызывается как раз в следующем цикле для загруженных файлов, чтобы избежать ситуации, когда ты подписываешься на это событие, а оно уже сработало.
__________________
if (love is true) break my.heart; |
|
|||||
Регистрация: May 2009
Адрес: Санкт-Петербург
Сообщений: 79
|
Rzer, а можно поподробнее, или ссылочку какую-нибудь дайте, а то не совсем понятна ваша мысль?
|
|
|||||
Ивенты помещаются в стек, загрузка файла началась, соответственно теоретически файл может скачаться за один кадр. Было бы удивительнее если бы Complete сработал прежде EF
P.S. Кстати вроде бы с версии 11.2 есть и многопоточность... |
|
|||||
strange mood
|
В моем понимании происходит следующее:
1. Вы запускаете загрузку. 2. Вызывается BEnterFrame. В этот момент загрузка завершается и в стек вызовов попадает Event.COMPLETE. 3. Внутри BEnterFrame вызывается смена кадра. В стек попадает продолжение BEnterFrame. Стадия выполнения кода в текущем кадре прекращается. 4. Кадр сменяется, наступает стадия выполнения кода. Выполняется код из стека (точнее очереди) вызовов - сначала отработка события, затем продолжение BEnterFrame. Более подробно о том, что за стадия выполнения кода, можно прочитать здесь: http://www.senocular.com/flash/tutor...rofoperations/
__________________
тонкий тролль, осеянный благодатью |
Часовой пояс GMT +4, время: 22:27. |
|
« Предыдущая тема | Следующая тема » |
|
|