Flex属于单线程,基于事件监听的异步处理机制,让人又爱又恨。全异步的处理方法,使代码遍布addEventListener和xxxHandler,没有顺序执行的代码一气呵成,且实现顺序执行很是复杂,无非就是前一个操作Handler中启动下一个操作,如此循环下去。
最近在Cairngorm 3的类库中发现了实现顺序执行的类库Task Library,支持Flex3 & 4,目前版本为1.7。
Task Library 任务库
Cairngorm任务库提供了一个顺序和并行执行任务的抽象。它可能被用于协调一个应用程序的启动序列,或管理需要特定的顺序进行的一系列异步进程。
介绍、文档及下载:http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+Libraries
翻译:http://hi.baidu.com/taotao5453/blog/item/e5f322f5798b8228bd310939.html
无论是顺序执行任务或者并行执行任务,Task Library的核心是Task。自定义Task时需继承Task,覆写performTask方法,并在该Task完成时调用complete方法。
顺序执行任务需添加Task到SequenceTask,当执行完最后一个任务后,会派发TaskEvent.TASK_COMPLETE事件。
并行执行任务需添加Task到ParallelTask,当所有任务都执行完毕后,才派发TaskEvent.TASK_COMPLETE事件。
读取单个XML文件的Task
import com.adobe.cairngorm.task.Task; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; public class XMLTask extends Task { private var name:string; private var filename:string; public function XMLTask(name:string, filename:String) { this.name = name; this.filename = filename; } override protected function performTask():void { var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, completeHandler); urlLoader.load(new URLRequest(filename)); } private function completeHandler(e:Event):void { var urlLoader:URLLoader = e.target as URLLoader; XMLLocator.getInstance()[name] = new XML(urlLoader.data); //可按实际情况保存获取的值,这里用单例模式保存供其他程序使用 complete(); } }
顺序读取多个XML文件
protected function creationCompleteHandler(event:FlexEvent):void { var task:SequenceTask = new SequenceTask(); task.addChild(new XMLTask("config", "config.xml")); task.addChild(new XMLTask("rule", "rule.xml")); task.addChild(new XMLTask("message", "message.xml")); task.addEventListener(TaskEvent.TASK_COMPLETE, taskCompleteHandler); task.start(); } private function taskCompleteHandler(event:TaskEvent):void { var xml:XMLLocator = XMLLocator.getInstance(); trace(xml.config); trace(xml.rule); trace(xml.message); }
上面例子如需要并行读取,只需要把SequenceTask换成ParallelTask即可。
具体内容参考《cairngorm3工具类库Task》http://blog.chinaunix.net/space.php?uid=122937&do=blog&id=143124
注:我觉得Task Library适用于多个异步方法或异步方法与其他方法的顺序或并行执行中,如URLLoader、HTTPService、WebService、RemoteObject等需要事件通知完成的类。