[设计模式] AsyncToken模式,替换通常的Listener模式

[设计模式] AsyncToken模式,替换通常的Listener模式

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

 

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

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

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

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

 

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

 1       public   void  testSendEmail() {
 2           final  String address  =   " badqiu(a)gmail.com " ;
 3           final  String subject  =   " test " ;
 4           final  String content  =   " async token test " ;
 5          
 6           // 返回的token,包含token.addResponder()用于监听异步方法的执行结果
 7          AsyncToken token  =  sendAsyncEmail(address,subject,content);
 8          
 9           // token可以继续传递给外部,以便外面感兴趣的listener监听这个异步方法的执行结果
10          token.addResponder( new  IResponder() {
11               public   void  onFault(Exception fault) {
12                  System.out.println( " email send fail,cause: " + fault);
13                   // 此处可以直接引用address,subject,content,如,我们可以再次发送一次
14                  sendAsyncEmail(address,subject,content);
15              }
16               public   void  onResult(Object result) {
17                  System.out.println( " email send success,result: " + result);
18              }
19          });
20      }
21      
22       public  AsyncToken sendAsyncEmail(String address,String subject,String content) {
23           final  AsyncToken token  =   new  AsyncToken();
24          
25          Thread thread  =   new  Thread( new  Runnable() {
26               public   void  run() {
27                   try  {
28                       // do send email job
29                      token.setComplete(executeResult);  // 通知Responder token执行完
30                  } catch (Exception e) {
31                      token.setFault(e);  // 通知Responder token发生错误
32                  }
33              }
34          });
35          thread.start();
36          
37           return  token;
38      }

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

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

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

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

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

 

与Listener的异同:

1.token可以无限传递

2.没有使用事件,listener一般配合需要使用事件,然后由事件进行参数的绑定.

 

AsyncToken的源码:

http://code.google.com/p/rapid-framework/source/browse/trunk/rapid-framework/src/rapid_framework_common/cn/org/rapid_framework/util/concurrent/async/AsyncToken.java

你可能感兴趣的:([设计模式] AsyncToken模式,替换通常的Listener模式)