BulkLoader – замена Loader’у

Сентябрь 30, 2008

Download: http://code.google.com/p/bulk-loader/

ASDocs:
http://www.stimuli.com.br:8080/media/projects/bulk-loader/docs/

BulkLoader – это класс позволяющий загружать различные данные (картинки, swf, xml и т.д.) одновременно, без необходимости создания loader’a для каждого запроса. Например, нам необходимо сделать каркас сайта (прелоадер для всех разделов):

import br.com.stimuli.loading.BulkLoader;

var loader:BulkLoader = new BulkLoader("main-site");
//Создавая BulkLoader c именем "main-site" в другом месте, мы можем получить загруженные здесь файлы

private var itemName:String ="";
private var lastItem:String="";
//Имя выбранного раздела сайта (также имя файла swf)
private var lastShowedItem:String = "";
//Последняя флешка добавленная на сцену
private var lastPriority:int = 0;
//Приоритет загрузки (хранит последнее значение)

private var preloader:Preloader = new Preloader();
//Кастомный прелоадер (см. функцию showProgress)

public function show(prmItemName:String):void{
	itemName = prmItemName;
	showItem();
}

private function showItem(e:Event = null):void {
	if(lastItem != itemName){
	//Выбрали другой раздел
		if (lastShowedItem != ""){
			container.removeChild(loader.getMovieClip(lastShowedItem));
			//также есть функции getXML, getBitmap, getBitmapData, getSound и т.п.
			lastShowedItem ="";
		}
		if (loader.get(itemName) != null) {
		//Загрузка начиналась до этого
			if (loader.get(itemName).isLoaded == true) {
			//Загрузка прошла - добавим на сцену
				if (this.contains(preloader)) {
					removeChild(preloader);
				}
				container.addChild(loader.getMovieClip(itemName));
				lastShowedItem = itemName;
			} else {
			//Загрузка для данного раздела не завершена
			//Продолжим с высшим приоритетом
				if (!this.contains(preloader)) {
					addChild(preloader);
				}
				lastPriority++;
				loader.changeItemPriority(itemName, lastPriority);
			}
		} else {
		//Начала загрузки не было - запустим
			if (!this.contains(preloader)) {
				addChild(preloader);
			}
			lastPriority++;
			loader.add(itemName + ".swf", { id: itemName, priority:lastPriority } );
			loader.get(itemName).addEventListener(Event.COMPLETE, showItem);
			//Метод get позволяет добавлять события отдельно для каждого процесса
			loader.get(itemName).addEventListener(ProgressEvent.PROGRESS, showProgress);
			loader.start();
		}
		lastItem =  itemName;
	}
}

private function showProgress(e:ProgressEvent = null):void {
//Общая функция прогресса загрузки
	if (loader.get(lastItem).isLoaded != true) {
		preloader.progress(loader.get(lastItem).bytesLoaded , loader.get(lastItem).bytesTotal);
	}
}

Код довольно понятный и не требует изменения при увеличении или уменьшении количества разделов.