【Flex】实现模块顺序执行
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等需要事件通知完成的类。
浙公网安备 33010602011771号