Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.07.2019, 19:59
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 1  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 172
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Question Можно ли 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);
     }
}
__________________
кто не отвечает, того garbage collector забирает

Старый 26.07.2019, 05:21
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,434
Код AS3:
addChild(ldr);
Eсли ты напишешь по форме — this.addChild(ldr), то собственными глазами увидишь, как отдаешь ссылку на лоадер некоему this. После такого кто ж его удалит, он же памятник.

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

Старый 26.07.2019, 08:43
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,633
Записей в блоге: 4
Короткий ответ, да можно.

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);
}
Тогда никаких ссылок не останется
__________________
Ко мне можно и нужно обращаться на ты)

Старый 26.07.2019, 19:55
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 4  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 172
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
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 . Ознакомлюсь
__________________
кто не отвечает, того garbage collector забирает

Старый 26.07.2019, 22:52
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,434
Цитата:
Тогда по идее объектом ldr может заинтересоваться сборщик до того, как сработал onComplete ?
Теоретически да, хотя на практике никогда с таким не сталкивался.
Если заморачивает, лучше сделать приватную переменную. Если это динамическая галерея, сделать массивчик для временного хранения ссылок (в onComplete ты всегда сможешь обнулить ссылку в приватном массиве, найдя свой лоадер через indexOf()).
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:15.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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