Просмотр полной версии : Очистка загрузчиков
Нашел загрузчик для картинок, переведенный в ByteArray:
package {
public class ImageLoader{
import flash.net.*;
import flash.events.*;
public function load(bytes:*):void {
var failover_loader:Loader = new Loader();
failover_loader.loadBytes(bytes);
failover_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
}
private function loadComplete(e:Event):void {
var loaderInfo:LoaderInfo = LoaderInfo(e.target);
trace(loaderInfo.width + "x" + loaderInfo.height);
}
}
}
Загружаю кучу фоток:
for(var i:int = 0; i < 20; i++) {
var il:ImageLoader = new ImageLoader();
il.load(bytes);
}
Как мне удалять каждый экземпляр загрузчика после успешной загрузки?
undefined
10.11.2015, 14:14
у вас область видимости переменной il - текущий метод. После выполнения всего цикла и выхода из метода ссылок на 20 ImageLoader'ов не останется что есть утечка памяти и, кстати, ваш загрузчик страдает той же самой болезнью
undefined, как избежать этой утечки памяти?
undefined
10.11.2015, 14:47
вынести объявление
var il:ImageLoader
из метода на уровень класса/кадра.
и поправить загрузчик:
package {
import flash.net.*;
import flash.events.*;
public class ImageLoader{
private var failover_loader:Loader;
public function load(bytes:*):void {
failover_loader = new Loader();
failover_loader.loadBytes(bytes);
failover_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
}
private function loadComplete(e:Event):void {
failover_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadComplete);
var loaderInfo:LoaderInfo = LoaderInfo(e.target);
trace(loaderInfo.width + "x" + loaderInfo.height);
}
}
}
ПС: лучше сразу заведи привычку если подписался где-то на что-то, надо где-то и отписаться(см.код выше), иначе утечки замучают.
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#unload%28%29
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#unloadAndStop%28%29
А для чего вам байты грузить?
undefined
10.11.2015, 14:50
Как мне удалять каждый экземпляр загрузчика после успешной загрузки?
удалять ничего не надо, после загрузки сборщик мусора сам все почистит.
Добавлено через 6 минут
еще момент: подписку
failover_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
лучше делать до загрузки
failover_loader.loadBytes(bytes);
т.к. подозреваю, что loadBytes - операция синхронная и Event.COMPLETE кинется сразу же после вызова loadBytes
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#unload%28%29
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#unloadAndStop%28%29
А для чего вам байты грузить?
Класс FZip для работы с архивами отдает содержимое файлов в нем в виде байтов.
Добавлено через 3 минуты
удалять ничего не надо, после загрузки сборщик мусора сам все почистит.
Добавлено через 6 минут
еще момент: подписку
failover_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
лучше делать до загрузки
failover_loader.loadBytes(bytes);
т.к. подозреваю, что loadBytes - операция синхронная и Event.COMPLETE кинется сразу же после вызова loadBytes
Нет, операция асинхронная, поэтому не важно какой строкой идет Комплит.
Спасибо за помощь.
undefined
10.11.2015, 18:40
Нет, операция асинхронная
действительно.Интересно с чем связана задержка.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.