Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Удалить загруженную флешку с загружающей флешки (http://www.flasher.ru/forum/showthread.php?t=195021)

TurboDizel 26.02.2013 23:23

Удалить загруженную флешку с загружающей флешки
 
С помощью Loader`а загружаю флешку. Всё старое на экране очищаю, и добавляю на область этот лоадер. Пусть он свое отработал, и теперь мне надо обратно вернутся к первоначальной флешке, для чего нужно удалить загруженную. Как это сделать?
Я, не зная вообще, могло ли такое сработать, попробовать dispatchEvent. Но видимо между двумя флешками это не работает, так как пытался даже просто trace вывести вместо удаления лоадера, и не катит.
главная флешка
Код AS3:

var loader....//тут создаю, загружаю и так далее
loader.addEventListener("end_of_loader", f_eol);
 
function f_eol(e:Event):void {
  trace("Дошло");
}

В подгружаемой флешке, когда её нужно удалить, пишу:
Код AS3:

dispatchEvent(new Event("end_of_loader"));


dimarik 27.02.2013 01:58

Удалите loader из дисплейлиста
Быстро loader.parent.removeChild(loader);

TurboDizel 28.02.2013 21:08

Цитата:

Сообщение от dimarik (Сообщение 1122609)
Удалите loader из дисплейлиста
Быстро loader.parent.removeChild(loader);

Попробовал что-то такое:
Код AS3:

parent.removeChild(this);

Выдает ошибку: 2069 Класс Loader не реализует этот метод.

silin 28.02.2013 23:18

событие не срабатывает, потому что подписан на него лоадер, а вещает загруженная флешка
т.е. надо или подписывать loader.content (после загрузки) или вещать всплывающее событие
Код AS3:

dispatchEvent(new Event("end_of_loader", true));


incoob 28.02.2013 23:58

Цитата:

Сообщение от TurboDizel (Сообщение 1122942)
Попробовал что-то такое:
Код AS3:

parent.removeChild(this);

Выдает ошибку: 2069 Класс Loader не реализует этот метод.

Скорее всего сработает
Код AS3:

parent.parent.removeChild(parent);

. Таким образом вы удалите loader из display list (как и предлагал выше dimarik).

Но я бы за такой код оторвал руки. Смотрите на вариант от silin-а.

dimarik 01.03.2013 00:20

Потише, пожалуйста, насчет отрывания рук. Я же русским по коричневому написал, что это быстро.

TurboDizel 01.03.2013 00:23

Цитата:

Сообщение от silin (Сообщение 1122974)
событие не срабатывает, потому что подписан на него лоадер, а вещает загруженная флешка
т.е. надо или подписывать loader.content (после загрузки) или вещать всплывающее событие
Код AS3:

dispatchEvent(new Event("end_of_loader", true));


Действительно, большое спасибо!

Из результата следует ещё один маленький вопрос: после удаления загруженной флешки со сцены, её звуки все равно продолжают проигрываться, мне их останавливать вручную перед удалением, или всё таки можно как-то закрыть эту флешку так, чтобы всё связанное с ней отвязалось?

dimarik 01.03.2013 00:47

Из результата следует, что все осталось в аппдомене и прекрасно продолжает работать. Удалите все ссылки на дефинишины из того аппдомена, остановите таймеры и звуки и, если не использовали всякие Font.registerFont, то аппдомен выгрузится и освободит память. Воспользуйтесь Loader#unloadAndStop(), наконец.

TurboDizel 01.03.2013 00:56

Цитата:

Сообщение от dimarik (Сообщение 1122987)
Из результата следует, что все осталось в аппдомене и прекрасно продолжает работать. Удалите все ссылки на дефинишины из того аппдомена, остановите таймеры и звуки и, если не использовали всякие Font.registerFont, то аппдомен выгрузится и освободит память. Воспользуйтесь Loader#unloadAndStop(), наконец.

Да вот как только написал вопрос, сразу нашел unloadAndStop(), но то ли CS3 не знает такой функции, то ли я что-то не так делаю, но выдает ошибку:
1061: Call to a possibly undefined method unloadAndStop through a reference with static type flash.display:Loader.
В ручную до удаления остановил всевозможные звуки, думал этого хватит).

dimarik 01.03.2013 01:02

Проверьте в настройках, для какой версии Flash Player компилируете. Точно не помню, гляньте в справке в какой она появилась.

TurboDizel 01.03.2013 01:10

Функция есть начиная с Flash Player 10, а CS3 компилирует максимум для 9.
Если без этой функции, может просто остановить все звуки, потом удалить со сцены, потом loader.unload();, и loader = null?

dimarik 01.03.2013 01:37

Удалите все ссылки на definitions, которые привнесла эта флпшка. Чем вы пользовались -- классы, методы, а также объекты этих классов, отпишитесь от прослушивания событий, вещаемых этой флешкой, точнее ее дефинишинами.

gloomyBrain 01.03.2013 01:57

dimarik, а как отписка от событий экземпляров загруженных классов поможет сборщику мусора? Ведь это отправитель события держит ссылку на обработчик, а не наоборот. Или я что-то упустил?

TurboDizel 01.03.2013 02:33

Цитата:

Сообщение от dimarik (Сообщение 1123000)
Удалите все ссылки на definitions, которые привнесла эта флпшка. Чем вы пользовались -- классы, методы, а также объекты этих классов, отпишитесь от прослушивания событий, вещаемых этой флешкой, точнее ее дефинишинами.

Просто не приходилось ещё так детально убираться, поэтому с усложнениями понимаю подобное. Но спасибо, опираясь на это найду что почитать, чтобы правильно удалить все ссылки. А то в голове куча вопросов, что удалять нужно, а что нет).

silin 01.03.2013 08:54

Цитата:

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

gloomyBrain 01.03.2013 12:03

Ну тут скорее логическая ошибка, чем какой-то подвох. Флешка же не сама себя добавила? Нет. Ну значит и удалять себя она тоже не должна. Иначе картина идеального мира с иерархией, полиморфизмом и бритвой Оккама рушится.

dimarik 01.03.2013 12:50

Цитата:

Сообщение от gloomyBrain (Сообщение 1123003)
dimarik, а как отписка от событий экземпляров загруженных классов поможет сборщику мусора? Ведь это отправитель события держит ссылку на обработчик, а не наоборот. Или я что-то упустил?

Верно, полпервого было.

silin 01.03.2013 13:09

Цитата:

Ну тут скорее логическая ошибка, чем какой-то подвох. Флешка же не сама себя добавила? Нет. Ну значит и удалять себя она тоже не должна. Иначе картина идеального мира с иерархией, полиморфизмом и бритвой Оккама рушится.
ну в смысле идеальной картины понятно, только чего уж руки-то сразу
кстати, а ничего, что ради этого надо дополнительно пару-тройку объектов создать, Оккама тут как, не против ?

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

incoob 01.03.2013 14:13

Цитата:

Сообщение от silin (Сообщение 1123024)
а можно вопрос к 'отрывальщикам рук'?
если проектируется именно одноразовая флешка - отгыграла и все, то каким образом и кому она может нагадить, если самоудалится?
я честно не понимаю, в чем тут подвохи

Флешка отыграла и самоудалилась:
Код AS3:

parent.removeChild(this);

Флешка отыграла, полезла в родителя своего parent-а, и стала что-то со своим parent-ом делать:
Код AS3:

parent.parent.removeChild(parent);

А если продолжить логику, то что, код
Код AS3:

parent.parent.parent.removeChild(parent.parent);

тоже будет приемлемым (а я подобное видел)?

Вот честно скажу, когда вижу parent.parent, хочется отрывать руки.

А так да, произвести минимальное и оправданное количество ***нокода часто бывает лучше, чем "городить замки".

gloomyBrain 01.03.2013 23:07

Плохокод не может быть оправдан! =)


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

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