PDA

Просмотр полной версии : Как дождаться окончание загрузки Loader()


LightDemon
22.04.2012, 18:51
Загружаю картинку с помощью Loader() :

public function loadFon01(dir:String):void {
var loader01=new Loader ;
trace(dir);
var urlReq:URLRequest=new URLRequest(dir);
loader01.contentLoaderInfo.addEventListener(Event.COMPLETE,placeImage);
loader01.load(urlReq);
trace ("Func loadFon01 End");

private function placeImage(event:Event):Object {

var loader01:Loader=Loader(event.target.loader);
var myImage:Bitmap=Bitmap(loader01.content);
myImage.x=0;
myImage.y=0;
myImage.width=550;
myImage.height=400;
trace('нарисовали');
return myImage;
}

Как сделать так чтобы функция placeImage выполнялась не по Event.COMPLETE, а по окончанию загрузки внутри функции loadFon01?

illuzor
22.04.2012, 19:03
Вы всё правильно делаете. Можно, конечно, слегка оптимизировать код.

Можно сюда:
loader01.contentLoaderInfo.addEventListener(Event.COMPLETE,placeImage);
вместо ссылки на функцию вставить саму функцию, но тогда получится анонимная функция. Это плохая практика. Не делайте так.

КорДум
22.04.2012, 19:04
Никак. Загрузка асинхронна.

LightDemon
22.04.2012, 20:33
Вы всё правильно делаете. Можно, конечно, слегка оптимизировать код.

Можно сюда:
loader01.contentLoaderInfo.addEventListener(Event.COMPLETE,placeImage);
вместо ссылки на функцию вставить саму функцию, но тогда получится анонимная функция. Это плохая практика. Не делайте так.

Это понятно, но функция в любом случае будет выполняться только по наступлению события Event.Complete. А задача в том чтобы дальнейший код программы выполнялся только по окончанию загрузки...

Никак. Загрузка асинхронна.

Никак - это не ответ. В программирование вообще нет задач которые никак нельзя решить, в принципе решение должно выглядеть примерно так
public function loadFon01(dir:String):void {
var loader01=new Loader ;
trace(dir);
var urlReq:URLRequest=new URLRequest(dir);
loader01.load(urlReq);
// запускаем цикл проверяющий осуществилась ли загрузка
placeImage();
trace ("Func loadFon01 End");

только вот что в цикле писать не знаю, потому что плохо разбираюсь в отслеживании событий.

illuzor
22.04.2012, 20:44
Можно через while проверять. Но зачем? Это очень корявый костыль. Правильно - слушать окончание загрузки.

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

Объясните, зачем вам вообще это?

КорДум
22.04.2012, 20:45
И Ваше приложение повесится намертво, ибо во флеше один поток и словить событие лоадера не получится.
Ну не намертво, на 15 секунд, после чего придет предложение прервать работу приложения.

Aquahawk
22.04.2012, 20:46
Нельзя. Сознательно Adobe так сделала, чтобы не вешали интерфейс активным ожиданием и не ели ресурсы. Вы там хоть факториал миллиона считайте. Синхронных методов для загрузки или работы с файловой системой нет.
В программирование вообще нет задач которые никак нельзя решить
Решить можно, в вот желание писать код не так как надо а как хочется воплотить нельзя. Флаг в руки, можете конечно поискать, только потом поделитесь успехом такого мероприятия.

Bgg
22.04.2012, 20:46
В программирование вообще нет задач которые никак нельзя решить, в принципе решение должно выглядеть примерно так

Вы так говорите как будто вы изобрели "программирование".

LightDemon
22.04.2012, 22:21
Вы так говорите как будто вы изобрели "программирование".
Нет, программирование я конечно не изобретал, это скорее философский вопрос, что в жизни нет нерешаемых проблем!
КорДум, без обид, может я немного грубо ответил, но просто я не признаю ответ "никак", мне больше по душе как ответил Aquahawk, хотя по сути он сказал то же, что и Вы.

Просто до этого я в основном занимался функциональным программированием, и с объектно-ориентированным не сталкивался, поэтому возникают сложности с унаследованием классов и отслеживанием событий...

Объясните, зачем вам вообще это?

Эти функции у меня написаны в классе с помощью которого я хочу загрузить фоновую картинку. В основном классе создаю экземпляр loadFon и пытаюсь с помощью AddChild добавить в область видимости возвращаемый myImage вот так:
public function Main () {
var myFon= new loadFon();
var myImage=myFon.loadFon01(dir01);
trace (myImage)
addChild(myImage)
}

но почему-то addChild выполняется раньше чем placeImage

illuzor
22.04.2012, 22:53
И Ваше приложение повесится намертво, ибо во флеше один поток и словить событие лоадера не получится.
Ну не намертво, на 15 секунд, после чего придет предложение прервать работу приложения.Это да. Стормозил, не подумал...

LightDemon, может вам пока что стоит взять какой-нибудь сторонний лоадер?
Или чуть поглубже изучить as3.

Loader можно сразу добавить на сцену, но картинка отобразится тогда, когда будет загружена.

BuKT
23.04.2012, 10:55
public function Main () {
addChild(loadFon01(dir01))
}

public function loadFon01(dir:String):DisplayObject {
var loader01:Loader = new Loader();
var urlReq:URLRequest=new URLRequest(dir);
loader01.contentLoaderInfo.addEventListener(Event.COMPLETE, placeImage);
return loader01;
}
Вышеприведённый код отработает верно, но картинка будет отображена только по окончанию загрузки. Все настройки с ней будут проведены точно тогда же. Если вы хотите получить какие-то параметры загружаемого контента - можете слушать Event.INIT. На этом этапе становятся доступны некоторые свойства загружаемого.