最近在做读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>