Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Можно ли Loader объявить локально для разовой загрузки? (http://www.flasher.ru/forum/showthread.php?t=215732)

djken 25.07.2019 19:59

Можно ли Loader объявить локально для разовой загрузки?
 
Задался вопросом, чтобы наверняка быть уверенным...

Если мне нужно, например, разово по нажатию какой-нибудь кнопки выполнить загрузку чего-либо.
Могу ли Loader объявить не на уровне класса, а локально в методе и там же зарегистрировать обработчик?
Понятно, что больше не смогу обратиться к этому Лоадеру из других методов, но он мне и не нужен больше.

После того как onClick отработал, есть вероятность того, что onComplete не сработает в итоге? (Например, зачистится сборщиком, пока будет загружаться весомый файл...) Хотя в официальной документации примеры так и приведены с локальным объявлением..

Код AS3:

public class Example extends Sprite
{
 
    public function Example()
    {
    }
 
    public function onClick(e:MouseEvent):void
    {
          var ldr:Loader = new Loader();
          ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
          ldr.load(new URLRequest('http://test.ru/link'));
          addChild(ldr);
    }
 
    private function onComplete(e:Event):void
    {
          e.currentTarget.removeEventListener(Event.COMPLETE, onComplete);
    }
}


Wolsh 26.07.2019 05:21

Код AS3:

addChild(ldr);

Eсли ты напишешь по форме — this.addChild(ldr), то собственными глазами увидишь, как отдаешь ссылку на лоадер некоему this. После такого кто ж его удалит, он же памятник.

Добавлено через 13 минут
Цитата:

есть вероятность того, что onComplete не сработает в итоге?
А какая разница, сработает или нет? На судьбу ldr это никак не повлияет. Этот метод — removeEventListener(Event.COMPLETE, onComplete); — удаляет ИЗ ldr ссылку на метод onComplete экземпляра Example, а не ссылку НА ldr из экземпляра Example.

caseyryan 26.07.2019 08:43

Короткий ответ, да можно.

1) Добавляй в дисплей лист не Loader, а его содержимое
Код AS3:

addChild(e.target.content);

2) Подписывайся на другие события загрузчика, на тот случай, если COMPLETE не сработает, например из-за проблем с сетью, или отсутствием файла, а в их обработчиках отписывайся от всего, на что подписал загрузчик
Или можешь сделать так:
Код AS3:

ldr.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onError);
function onError(e:UncaughtErrorEvent):void {
  e.target.removeEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onError);
  e.target.removeEventListener(Event.COMPLETE, onComplete);
}

Тогда никаких ссылок не останется

djken 26.07.2019 19:55

Wolsh, про addChild понял - отдаю некоему this ссылку. А если, например, я делаю addChild внутри onComplete ? Тогда по идее объектом ldr может заинтересоваться сборщик до того, как сработал onComplete ?
Код AS3:

.....
    public function onClick(e:MouseEvent):void
    {
          var ldr:Loader = new Loader();
          ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
          ldr.load(new URLRequest('http://test.ru/link'));
    }
 
    private function onComplete(e:Event):void
    {
          e.currentTarget.removeEventListener(Event.COMPLETE, onComplete);
          addChild(e.target.content);
    }
.....

caseyryan,
1) да, так и делаю - на скорую руку не заметил. Спасибо
2) uncaughtErrorEvents никогда не использовал... Обычно использую IOErrorEvent.IO_ERROR и HTTPStatusEvent.HTTP_STATUS . Ознакомлюсь

Wolsh 26.07.2019 22:52

Цитата:

Тогда по идее объектом ldr может заинтересоваться сборщик до того, как сработал onComplete ?
Теоретически да, хотя на практике никогда с таким не сталкивался.
Если заморачивает, лучше сделать приватную переменную. Если это динамическая галерея, сделать массивчик для временного хранения ссылок (в onComplete ты всегда сможешь обнулить ссылку в приватном массиве, найдя свой лоадер через indexOf()).


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

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