要想知道flash加载一个xml,是一件很简单的事情,只有使用URLLoader就能够实现加载。目前在网上流行很多种加载的方式,有多种开源的项目。可以方便处理加载外部的资源,进行管理。只是用这样强大的功能的工具,固然带来方便和效率,不过当没有那些类的时候,我们怎样办呢?还是最好动手尝试写一个,尽管功能不强大,但是至少我们可以不受限制这些工具类库。这样对我们发展也会好。
现在我们来写一个加载多个xml的制作。
制作的方法:
public class XMLManager extends EventDispatcher
继承EventDispatcher事件分派类
public function add(path:String,id:String):void;//添加xml文件
public function start():void;//开始加载
public function getXML(id:String):XML;//返回xml文件
这种组合方式,是借鉴这些加载开源的类库。
类继承事件分派
添加文件
开始加载
借用关联数组Dictionary的作用实现存放对象。
一些技巧:
class Item { public var loader:URLLoader; public var path:String; public function Item(loader:URLLoader,path:String) { this.loader=loader; this.path=path; } }
这个类当中,可以记录一些数据。这种设计可以称为类结构体,就像c++结构体一样。这种类方便存储数据。
关联数组的使用:
public function add(path:String,id:String):void { var loader:URLLoader=new URLLoader(); m_data[id]=new Item(loader,path); num++; }
这样就能够像数组一样保存一个对象了,方便管理。
代码清单:
package { import flash.events.*; import flash.net.*; import flash.utils.Dictionary; public class XMLManager extends EventDispatcher { private var m_data:Dictionary=new Dictionary(true); private var num:int=0; public function XMLManager() { } //添加文件 public function add(path:String,id:String):void { var loader:URLLoader=new URLLoader(); m_data[id]=new Item(loader,path); num++; } //开始加载 public function start():void { for (var i:String in m_data) { m_data[i].loader.load(new URLRequest(m_data[i].path)); m_data[i].loader.addEventListener(Event.COMPLETE,completeHandler); m_data[i].loader.addEventListener(IOErrorEvent.IO_ERROR,ErrorHandler); m_data[i].loader.addEventListener(ProgressEvent.PROGRESS,ProgressHandler); } } //返回加载的时候的xml数据 public function getXML(id:String):XML { var xml:XML=XML(m_data[id].loader.data); return xml; } //完成处理 private function completeHandler(event:Event):void { event.currentTarget.removeEventListener(Event.COMPLETE,completeHandler); num--; if (num==0) { this.dispatchEvent(new Event("loadComplete")); } } //错误处理 private function ErrorHandler(event:IOErrorEvent):void { this.dispatchEvent(new Event("loadError")); } //进度 private function ProgressHandler(event:ProgressEvent):void { this.dispatchEvent(new Event("loadProgress")); } } } import flash.net.URLLoader; class Item { public var loader:URLLoader; public var path:String; public function Item(loader:URLLoader,path:String) { this.loader=loader; this.path=path; } }
测试一下自己的类结果:
var xml:XMLManager=new XMLManager(); xml.add("1.XML","id1"); xml.add("2.XML","id2"); xml.add("3.XML","id3"); xml.start(); xml.addEventListener("loadComplete",completeHandler); function completeHandler(event:Event):void { trace(xml.getXML("id1")); trace(xml.getXML("id2")); trace(xml.getXML("id3")); }
拓展:
通过这种方式,我们已经实现到加载的目的,对没有太多要求的,这种加载多个xml的设计基本已经实现到。现在我们想一想
如果我们加载多个mp3,那么我们应该怎样设计?同理,我们可以借鉴这种加载的方式,通过设计可以完成这样的功能类。结合这些,就能实现更大强大的加载管理类。就像开源项目当中BulkLoader类和QueueLoader类一样。一点点实现。