flex 继承EventDispatcher,实现异步操作的总结

最近在做读XML文件,然后显示出xml文件的内容。

      读没有什么大的问题,但是在显示的时候,一开始以为直接读就行,结果发现flex中的URLLoader是异步执行的,所以显示的时候,总是空的。郁闷死了,先是想做个标志位,后来觉得他麻烦,不可能让他一直在那死循环吧,否决掉。后来想用Timer休眠,发现好像也不是什么好办法。想啊想,想到一个词,异步。赶紧上网搜,果然适合.

      因为Flex做的是客户端,所以异步操作是很正常的事情,为了界面友好性嘛,然后开始研究怎么实现异步:

      先谈谈自己对异步的理解:异步者,异步也,事情非同时顺序执行,而是分开先后执行。就像你去给boss打电话领工资,但是boss做账很忙,暂时没法理你,你不能老是不停的打吧,或者堵着门不让别人进,这是不礼貌的,这时候你就可以通过秘书,挂个号,一旦老板帐弄好了,秘书就会通知你去领钱。多方便啊,中间你爱干嘛干嘛去,看看小说,瞅瞅美女,骚扰骚扰小妹,自由自在的很,反正可以领钱的时候,秘书MM会通知的。

 

第一步:发饷日子到了,启动发饷程序。(初始化,实现读取XML文件)

/**

* 读取XML文件工具,继承了EventDispatcher,实现异步消息通知

* */

public class ReadToolsListFromXML extends EventDispatcher

{

static var tools:XML;

static var xmlURL:String = "config/ToolsList.xml";

static var loadXML:URLLoader ;

[Event("Complete", "LoadXMLCompleteEvent")] 

//构造函数,进行xml文件读取的工作

public function ReadToolsListFromXML()

var reqXmlURL:URLRequest = new URLRequest(xmlURL);//请求xml文件

try{

loadXML = new URLLoader(reqXmlURL);//加载xml文件

}catch(error:SecurityError){

trace("A SecurityError has occurred.");

}

loadXML.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);

loadXML.addEventListener(Event.COMPLETE,xmlLoaded);//加载完成后,读取xml文件到相应操作对象中

}

 

第二步:老板做账,做完后,告诉秘书,可以发钱了。(读取xML文件到相应的操作对象,并发布读取完成消息)

//加载xml文件到相应的对象,并发布消息

function xmlLoaded(event:Event):void

{

try {

tools = XML(loadXML.data);

trace(tools.toXMLString());

var eve:LoadXMLCompleteEvent = new LoadXMLCompleteEvent("Complete");//读取完成消息

dispatchEvent(eve);//将寻找注册了改消息的消息监听器匹配,并触发该监听器

} catch (e:TypeError) {

                trace("Could not parse the XML file.");

            }

}

 

第三步:自由散漫的我,该收收心,拿钱去了。(监听消息的消息监听器开始进行后续处理)

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="com.ztesoft.common.toolbar.*" creationComplete="init()">

<mx:Script>

<![CDATA[

 

import com.ztesoft.common.toolbar.ReadToolsListFromXML;

 

var show:ReadToolsListFromXML = new ReadToolsListFromXML();

 

public function init():void{

//var toolslist:XMLList = show.getToolsList();  

show.addEventListener("Complete",initPanel);//注册消息到消息监听器

 

}

//消息处理函数

private function initPanel(eve:Event):void{

var tools:XMLList = show.getToolsList();//获取XMLList

for each(var items in tools){

trace("here is "+items);

}

 

]]>

</mx:Script> 

</mx:Application>

PS:补充一句,秘书MM很漂亮,所以咱说话得好听点啊,让人家印象深刻。(定义自己的消息)
package com.ztesoft.common.events
{
import flash.events.Event;
//自定义消息,继承自Event
public class LoadXMLCompleteEvent extends Event
{
public function LoadXMLCompleteEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
}
}
噢了。事后想想,还真挺方便。如有描述不对之处,还请各位大牛指点。

 

你可能感兴趣的:(xml,function,Flex,application,import,tools)