Представим, что нашему приложению нужно загрузить некоторые внешние ресурсы. Этими ресурсами могут быть png-файлы (которые в приложении мы будем использовать в виде Bitmap), и xml-файлы. Ну это потому, что мне нужны именно такие ресурсы. Причем файлов может быть несколько, а приложению нужно дождаться, пока загрузятся все, и потом продолжить выполнение.
Для сих целей я сделал класс ResourceLoader. Ему передаются линки на ресурсы, которые нужно загрузить, потом вызвается метод Load. По линкам класс определяет, какой вид ресурса и как нужно загрузить, загруженные данные сохраняет в Hash, откуда их можно будет получить по id-ресурса. Для png-файлов таким id будет сам url картинки, а для xml-файлов id должен быть указан в аттрибуте корневого узла. Ну и когда все файлы будут загружены, ResourceLoader оповестит приложение, что можно рабоать дальше.
/**
* @author Yzh
*/
package com.yzh44yzh.core;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
class ResourceLoader
{
// constants
static inline var REG_BITMAP: EReg = ~/.png$/i; //TODO - jpg, jpeg
static inline var REG_XML: EReg = ~/.xml$/i;
// properties
public var ReadyHandler: Void->Void;
private var busy: Bool;
private var numLoaded: Int;
private var toLoad: List<String>;
private var bitmaps: Hash<Bitmap>;
private var xmls: Hash<Xml>;
// constructor
public function new()
{
this.busy = false;
this.toLoad = new List();
this.bitmaps = new Hash();
this.xmls = new Hash();
}
// getters & setters
// methods
public function Add(url:String):Void
{
if(this.busy) throw 'ResouceLoader is busy';
//TODO - check is this url not added yet
this.toLoad.add(url);
}
public function Load():Void
{
this.busy = true;
this.numLoaded = 0;
for(url in this.toLoad)
{
if(REG_BITMAP.match(url))
{
var bl = new Loader();
bl.contentLoaderInfo.addEventListener(Event.COMPLETE, OnBitmap);
bl.load(new URLRequest(url));
}
else if(REG_XML.match(url))
{
var xl = new URLLoader();
xl.dataFormat = 'text';
xl.addEventListener(Event.COMPLETE, OnXml);
xl.load(new URLRequest(url));
}
}
}
public function GetBitmap(id:String):Bitmap
{
return this.bitmaps.get(id);
}
public function GetXml(id:String):Xml
{
return this.xmls.get(id);
}
private function OnBitmap(event:Event):Void
{
var id:String = event.target.url;
var bitmap:Bitmap = event.target.loader.content;
this.bitmaps.set(id, bitmap);
this.numLoaded++;
if(this.numLoaded == this.toLoad.length) this.Ready();
}
private function OnXml(event:Event):Void
{
var xml:Xml = Xml.parse(event.target.data);
var id:String = xml.firstElement().get('id');
this.xmls.set(id, xml);
this.numLoaded++;
if(this.numLoaded == this.toLoad.length) this.Ready();
}
private function Ready():Void
{
this.busy = false;
this.toLoad.clear();
this.ReadyHandler();
}
public function toString():String { return 'ResourceLoader'; }
}
Пример использования класса:
this.loader = new ResourceLoader();
this.loader.ReadyHandler = this.Start;
this.loader.Add('skin.png');
this.loader.Add('skin.xml');
this.loader.Load();