对于一个异步的方法调用,我们需要异步的得到调用结果,通常我们会使用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