AsyncToken机制替换通用的Listener机制

来源:互联网 发布:数据库怎么看表格 编辑:程序博客网 时间:2024/06/05 01:05

对于一个异步的方法调用,我们需要异步的得到调用结果,通常我们会使用Listener模式,用于监听方法异步调用的结果.

但应用该方法在实际使用中其实并不灵活.

1.因为由于Service的方法很多,可能会导致Listener要监听的事件过多.

2.一般Listenner都是事先设置好监听器,不能在方法调用的过程中灵活的增加新的监听器

3.对如发送消息失败再次发送消息这种需求处理会比较别扭.

以下为应用AsyncToken的使用示例:

public void testSendEmail() {final String address = "badqiu(a)gmail.com";final String subject = "test";final String content = "async token test";//返回的token,包含token.addResponder()用于监听异步方法的执行结果AsyncToken token = sendAsyncEmail(address,subject,content);//token可以继续传递给外部,以便外面感兴趣的listener监听这个异步方法的执行结果token.addResponder(new IResponder() {public void onFault(Exception fault) {System.out.println("email send fail,cause:"+fault);//此处可以直接引用address,subject,content,如,我们可以再次发送一次sendAsyncEmail(address,subject,content);}public void onResult(Object result) {System.out.println("email send success,result:"+result);}});}public AsyncToken sendAsyncEmail(String address,String subject,String content) {final AsyncToken token = new AsyncToken();Thread thread = new Thread(new Runnable() {public void run() {try {//do send email job...token.setComplete(executeResult); //通知Responder token执行完}catch(Exception e) {token.setFault(e); //通知Responder token发生错误}}});thread.start();return token;}

 

如上代码,使用AsyncToken的好处:

1. token可以无限传递,只要对方法的执行结果感兴趣,都可以监听方法的执行结果.

2. 拥有上下文,还可以引用前面的参数,以执行任务email重发这种任务

3. 一个token与一个方法对应,方法调用时你即知道token对应的事件,不需要使用listener模式中的一般用EventType来区别不现的事件

3. 灵活转换,也可以将上面的token再转至listener,再由listener以事件的方式派发事件

与Listener的异同:

1.token可以无限传递

2.没有使用事件或是监听不同的方法,listener一般配合需要使用事件,然后由事件进行参数的绑定.

3.listener模式一般是先设置好listener,而AsyncToken可以得到token后再添加监听方法

 

Flex异步令牌AsyncToken的用法介绍

            来自:http://blog.csdn.net/jiabangok/article/details/4904983

什么是AsyncToken?官方文档是这样描述的:"这个类针对异步RPC操作提供了一个用来设置额外的或者令牌级数据的地方。它也允许一个IResponder作为一个独立调用被附加。这个AsyncToken能够在ResultEvent和FaultEvent中用token属性来引用。"
如果你对Flex中远程异步调用的本质不熟悉,肯定还是有点困惑的。我碰见过大量的对这个便捷类不熟悉的人,因此我试着来让它明朗一点。
无论何时从你的flex/AIR应用中使用多个外部调用中的一个,你都不会知道这些调用是否或者何时返回结果(或者错误),你也不会知道它们返回的顺序。即使你按照"RO1","RO2","RO3"的顺序调用远程对象,它们返回的顺序还是可能不一样。你可能也希望针对这些结果能有不同的处理。
一种方式就是给每一个调用分配一个异步令牌(AsyncToken )来追踪这些调用。
不要这样来进行远程调用:
myRO.myRemoteMethod();
你应该这样:
var token:AsyncToken=myRO.myRemoteMethod();(确保导入了mx.rpc.AsyncToken)

现在就有了一个变量"token",代表这个单独的调用。像这样,你可以分配token自己的result和fault处理函数
token.addResponder(myResponderClass);
这里myResponderClass类实现了IResponder.实现Iresponder简单的意味着定义了如下两个方法签名:
* public function result(data:Object):void
* public function fault(info:Object):void
因此你可以对你的远程调用在调用时设置result和fault处理函数,而不用把硬编码放到你的远程对象,HTTPService或者WebService标签里。这也恰好就是Cairngorm和其他微体系结构的运行方式。
AsyncToken最后一点很酷的特性就是它是动态类。这意味着,当你进行远程调用时可以添加属性到token上,然后result/fault处理函数中读取这些属性。

另外,在flex sdk3.4中有CallResponder,可以用CallResponder实例的token属性引用这个异步令牌。在flex sdk3.2中式没有这个类的,如果要用的话就只能自己写了,只要这个类继承自Iresponder接口就可以了


 

原创粉丝点击