每天学一点flash(61) flash加载多个xml设计

要想知道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的作用实现存放对象。

 

一些技巧:

 

  1. class Item  
  2. {  
  3.  public var loader:URLLoader;  
  4.  public var path:String;  
  5.  public function Item(loader:URLLoader,path:String)  
  6.  {  
  7.   this.loader=loader;  
  8.   this.path=path;  
  9.   
  10.  }  
  11. }  

 

 

这个类当中,可以记录一些数据。这种设计可以称为类结构体,就像c++结构体一样。这种类方便存储数据。

 

关联数组的使用:

 

  1. public function add(path:String,id:String):void  
  2.   {  
  3.    var loader:URLLoader=new URLLoader();  
  4.    m_data[id]=new Item(loader,path);  
  5.    num++;  
  6.   }  

 

这样就能够像数组一样保存一个对象了,方便管理。

 

 

 

代码清单:

 

 

[c-sharp] view plaincopy
  1. package   
  2. {  
  3.     import flash.events.*;  
  4.     import flash.net.*;  
  5.     import flash.utils.Dictionary;  
  6.     public class XMLManager extends EventDispatcher  
  7.     {  
  8.         private var m_data:Dictionary=new Dictionary(true);  
  9.         private var num:int=0;  
  10.         public function XMLManager()  
  11.         {  
  12.         }  
  13.         //添加文件  
  14.         public function add(path:String,id:String):void  
  15.         {  
  16.             var loader:URLLoader=new URLLoader();  
  17.             m_data[id]=new Item(loader,path);  
  18.             num++;  
  19.         }  
  20.         //开始加载  
  21.         public function start():void  
  22.         {  
  23.             for (var i:String in m_data)  
  24.             {  
  25.                 m_data[i].loader.load(new URLRequest(m_data[i].path));  
  26.                 m_data[i].loader.addEventListener(Event.COMPLETE,completeHandler);  
  27.                 m_data[i].loader.addEventListener(IOErrorEvent.IO_ERROR,ErrorHandler);  
  28.                 m_data[i].loader.addEventListener(ProgressEvent.PROGRESS,ProgressHandler);  
  29.             }  
  30.         }  
  31.         //返回加载的时候的xml数据  
  32.         public function getXML(id:String):XML  
  33.         {  
  34.             var xml:XML=XML(m_data[id].loader.data);  
  35.             return xml;  
  36.         }  
  37.         //完成处理  
  38.         private function completeHandler(event:Event):void  
  39.         {  
  40.             event.currentTarget.removeEventListener(Event.COMPLETE,completeHandler);  
  41.             num--;  
  42.             if (num==0)  
  43.             {  
  44.                 this.dispatchEvent(new Event("loadComplete"));  
  45.             }  
  46.         }  
  47.         //错误处理  
  48.         private function ErrorHandler(event:IOErrorEvent):void  
  49.         {  
  50.             this.dispatchEvent(new Event("loadError"));  
  51.         }  
  52.         //进度  
  53.         private function ProgressHandler(event:ProgressEvent):void  
  54.         {  
  55.            this.dispatchEvent(new Event("loadProgress"));  
  56.         }  
  57.     }  
  58. }  
  59.   
  60. import flash.net.URLLoader;  
  61.   
  62. class Item  
  63. {  
  64.     public var loader:URLLoader;  
  65.     public var path:String;  
  66.     public function Item(loader:URLLoader,path:String)  
  67.     {  
  68.         this.loader=loader;  
  69.         this.path=path;  
  70.   
  71.     }  
  72. }  

 

 

 

测试一下自己的类结果:

 

  1. var xml:XMLManager=new XMLManager();  
  2. xml.add("1.XML","id1");  
  3. xml.add("2.XML","id2");  
  4. xml.add("3.XML","id3");  
  5. xml.start();  
  6. xml.addEventListener("loadComplete",completeHandler);  
  7.   
  8. function completeHandler(event:Event):void  
  9. {  
  10.     trace(xml.getXML("id1"));  
  11.     trace(xml.getXML("id2"));  
  12.       
  13.     trace(xml.getXML("id3"));  
  14. }  

 

 

 

拓展:

通过这种方式,我们已经实现到加载的目的,对没有太多要求的,这种加载多个xml的设计基本已经实现到。现在我们想一想

如果我们加载多个mp3,那么我们应该怎样设计?同理,我们可以借鉴这种加载的方式,通过设计可以完成这样的功能类。结合这些,就能实现更大强大的加载管理类。就像开源项目当中BulkLoader类和QueueLoader类一样。一点点实现。

posted @ 2012-01-15 17:55  rob_2010  阅读(207)  评论(0)    收藏  举报