Использование Loader без создания ссылки - PullRequest
0 голосов
/ 09 января 2010

Я много раз загружал изображения в мой видеоклип. Но единственный способ, которым я знаю, как это сделать - это загрузить контент, добавить прослушиватель событий, подождать, пока он завершит работу в обработчике, используя ссылку на загрузчик, подобную этой.

protected function loadImage(imageDir:String):void
        {
             loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT,tilesLoadInit);
            loader.load(new URLRequest(imageDir));
        }
 private function tilesLoadInit e:Event):void {
               sprite = Bitmap(loader.content).bitmapData;
               //load in xml file for map
               xmlToArray();
         }

Я пытаюсь быть более легким с моим кодом. И я бы скорее вызвал мой метод loader: класс Loader локально в методе, а не делал ссылку в моем классе. Есть ли способ получить этот объект загрузчика в параметре Event.INIT моего обработчика?

То же самое со спрайтами в целом. Скажи, я создаю кнопку. пользователь нажимает на него, и он вызывает обработчик. В любом случае, я могу получить эту кнопку, удалить ее со сцены через параметр Event вместо создания ссылок на Class для их удаления.

Я хочу сделать это, чтобы упростить сбор мусора. поэтому вместо создания ссылок на классы всех моих объектов. Я бы предпочел называть их локально, поэтому, когда я уберу их со сцены, сборщик мусора позаботится о них.

1 Ответ

1 голос
/ 09 января 2010

Вы можете использовать event.currentTarget внутри прослушивателя событий, чтобы получить ссылку на объект, который зарегистрировал прослушиватель событий.

private function localFunc():void
{
  var btn:Button = new Button();
  btn.addEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(e:MouseEvent):void
{
  //e.currentTarget is typed as Object: in order to assign it to a 
  //variable of type Button, you must cast it accordingly.
  var btn:Button = Button(e.currentTarget);
}

В случае событий загрузчика currentTarget будет ассоциированным объектом LoaderInfo.LoaderInfo имеет свойство loader, которое указывает на исходный объект Loader.

private function tilesLoadInit(e:Event):void 
{
  var linfo:LoaderInfo = LoaderInfo(e.target);
  var ldr:Loader = linfo.loader;//this is the Loader you wanted
}

Свойства target и currentTarget будут одинаковыми в событиях LoaderInfo, но могут отличаться в кнопках и другихотображать объекты.Например, когда вы добавляете прослушиватель событий нажатия кнопки и щелкаете текстовое поле, являющееся дочерним элементом кнопки, event.target будет текстовым полем, а event.currentTarget будет кнопкой.По сути, target будет содержать точный объект, который вызвал событие, а currentTarget будет объектом, с которым был зарегистрирован текущий исполняющий прослушиватель событий.


Что касается сборки мусора, у вас естьудалить прослушиватель событий из соответствующего объекта, прежде чем сборщик мусора сможет его смести.Или вы можете использовать слабые ссылки при добавлении прослушивателя событий, установив пятый параметр true в методе addEventListener .Сборщик мусора не считает слабые ссылки при проверке, подходит ли объект для сборки мусора.

Но если вы используете слабую ссылку для локальной переменной, объект может получить GC, как только он выйдет из области видимости(то есть, когда метод возвращается), если у него больше нет ссылок на него, и слушатель события может вообще не вызываться: это не проблема с кнопками, так как вы добавили бы их в список отображения перед возвратом,таким образом создавая сильную ссылку на него.


Используйте Event.COMPLETE вместо Event.INIT для чтения содержимого.С aliveocs :

complete - Отправляется связанным объектом LoaderInfo, когда файл завершил загрузку.

init - Отправляетсясвязанный объект LoaderInfo, когда доступны свойства и методы загруженного SWF-файла.Событию init всегда предшествует событие complete.

...