Action的使用非常的简单,当需要创建独立的业务逻辑时就创建一个继承于Action的动作类。下面以加载文本文件(包括xml文件)为例,我将创建一个类专门来封装加载文本的逻辑,最后返回结果:
在主类中调用LoadTextFileAction:
按照最少知识的原则,主类只要和LoadTextFileAction、ActionUtil、接口IAction 打交道,只需侦听加载完成与失败的动作事件,无需知道加载的内部实现(如不需创建URLRequest 、URLLoader,也不需侦听URLLoader的事件)。而且LoadTextFileAction类也可以在以后的项目中复用了。
/**
*加载文本的动作类
*/
package sunnyluo.myactions
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import sunnyluo.action.Action;
import sunnyluo.action.ActionEvent;
public class LoadTextFileAction extends Action
{
private var _url:String; //文本路径
private var _dataFormat:String; //读取文本的数据格式(字符串、二进制、url值对)
private var _urlLoader:URLLoader;
public function LoadTextFileAction(url_:String, dataFomat_:String = "text", name_:String = "")
{
super(name_);
_url = url_;
_dataFormat = dataFomat_;
}
//开始执行
override public function execute(event:ActionEvent = null):void
{
loadText();
}
private function loadText():void
{
var __request:URLRequest = new URLRequest(_url);
_urlLoader = new URLLoader();
_urlLoader.dataFormat = _dataFormat;
_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
_urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
_urlLoader.addEventListener(Event.COMPLETE, onLoadComplete);
_urlLoader.load(__request);
}
//加载成功
private function onLoadComplete(event:Event):void
{
removeHandler();
var __data:*;
if(_urlLoader)
{
__data = _urlLoader.data;
}
this.actionCompleteHandler(__data);
}
//加载失败(找不到文件)
private function onIoError(event:IOErrorEvent):void
{
removeHandler();
trace(event.text, "LoadTextFileAction找不到文件:"+_url);
this.actionErrorHandler(event);
}
//加载失败(域错误)
private function onSecurityError(event:SecurityErrorEvent):void
{
removeHandler();
trace(event.text,"LoadTextFileAction域错误:"+_url);
this.actionErrorHandler(event);
}
//移除侦听
private function removeHandler():void
{
if(_urlLoader && _urlLoader.hasEventListener(Event.COMPLETE))
{
_urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIoError);
_urlLoader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
_urlLoader.removeEventListener(Event.COMPLETE, onLoadComplete);
}
}
//重写销毁方法
override public function destroy():void
{
super.destroy();
removeHandler();
_urlLoader = null;
}
}
}
在主类中调用LoadTextFileAction:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="init()">
<mx:Script>
<![CDATA[
import sunnyluo.myactions.LoadTextFileAction;
import sunnyluo.action.ActionUtil;
import sunnyluo.action.IAction;
import sunnyluo.action.ActionEvent;
private function init():void
{
var __action:IAction = new LoadTextFileAction("resource/test.xml");
ActionUtil.addActionHandler(__action, onLoadComplete, onLoadError);
__action.execute();
function onLoadComplete(event:ActionEvent):void
{
var __str:String = String(event.data);
trace(__str);
}
function onLoadError(event:ActionEvent):void
{
//trace(event);
}
}
]]>
</mx:Script>
</mx:WindowedApplication>
按照最少知识的原则,主类只要和LoadTextFileAction、ActionUtil、接口IAction 打交道,只需侦听加载完成与失败的动作事件,无需知道加载的内部实现(如不需创建URLRequest 、URLLoader,也不需侦听URLLoader的事件)。而且LoadTextFileAction类也可以在以后的项目中复用了。