【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等需要事件通知完成的类。

  

 
posted @ 2011-10-28 16:23  泥头  阅读(820)  评论(0编辑  收藏  举报