[設(shè)計(jì)模式] AsyncToken模式,替換通常的Listener模式
對于一個異步的方法調(diào)用,我們需要異步的得到調(diào)用結(jié)果,通常我們會使用Listener模式,用于監(jiān)聽方法異步調(diào)用的結(jié)果.
但應(yīng)用該方法在實(shí)際使用中其實(shí)并不靈活.
1.因?yàn)橛捎赟ervice的方法很多,可能會導(dǎo)致Listener要監(jiān)聽的事件過多.
2.一般Listenner都是事先設(shè)置好監(jiān)聽器,不能在方法調(diào)用的過程中靈活的增加新的監(jiān)聽器
3.對如發(fā)送消息失敗再次發(fā)送消息這種需求處理會比較別扭.
以下為應(yīng)用AsyncToken的使用示例:
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()用于監(jiān)聽異步方法的執(zhí)行結(jié)果
7 AsyncToken token = sendAsyncEmail(address,subject,content);
8
9 //token可以繼續(xù)傳遞給外部,以便外面感興趣的listener監(jiān)聽這個異步方法的執(zhí)行結(jié)果
10 token.addResponder(new IResponder() {
11 public void onFault(Exception fault) {
12 System.out.println("email send fail,cause:"+fault);
13 //此處可以直接引用address,subject,content,如,我們可以再次發(fā)送一次
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執(zhí)行完
30 }catch(Exception e) {
31 token.setFault(e); //通知Responder token發(fā)生錯誤
32 }
33 }
34 });
35 thread.start();
36
37 return token;
38 }
如上代碼,使用AsyncToken的好處:
1. token可以無限傳遞,只要對方法的執(zhí)行結(jié)果感興趣,都可以監(jiān)聽方法的執(zhí)行結(jié)果.
2. 擁有上下文,還可以引用前面的參數(shù),以執(zhí)行任務(wù)email重發(fā)這種任務(wù)
3. 一個token與一個方法對應(yīng),方法調(diào)用時你即知道token對應(yīng)的事件,不需要使用listener模式中的一般用EventType來區(qū)別不現(xiàn)的事件
3. 靈活轉(zhuǎn)換,也可以將上面的token再轉(zhuǎn)至listener,再由listener以事件的方式派發(fā)事件
與Listener的異同:
1.token可以無限傳遞
2.沒有使用事件,listener一般配合需要使用事件,然后由事件進(jìn)行參數(shù)的綁定.
AsyncToken的源碼: