PDA

Просмотр полной версии : Очистка загрузчиков


Vlad84
09.11.2015, 18:40
Нашел загрузчик для картинок, переведенный в 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'ов не останется что есть утечка памяти и, кстати, ваш загрузчик страдает той же самой болезнью

Vlad84
10.11.2015, 14:28
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);
}
}
}
ПС: лучше сразу заведи привычку если подписался где-то на что-то, надо где-то и отписаться(см.код выше), иначе утечки замучают.

udaaff
10.11.2015, 14:47
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

Vlad84
10.11.2015, 15:39
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
Нет, операция асинхронная
действительно.Интересно с чем связана задержка.