badqiu

          XPer
          隨筆 - 46, 文章 - 3, 評論 - 195, 引用 - 0
          數(shù)據(jù)加載中……

          [設(shè)計模式] AsyncToken模式,替換通常的Listener模式

          對于一個異步的方法調(diào)用,我們需要異步的得到調(diào)用結(jié)果,通常我們會使用Listener模式,用于監(jiān)聽方法異步調(diào)用的結(jié)果.

           

          但應(yīng)用該方法在實際使用中其實并不靈活.

          1.因為由于Service的方法很多,可能會導(dǎo)致Listener要監(jiān)聽的事件過多.

          2.一般Listenner都是事先設(shè)置好監(jiān)聽器,不能在方法調(diào)用的過程中靈活的增加新的監(jiān)聽器

          3.對如發(fā)送消息失敗再次發(fā)送消息這種需求處理會比較別扭.

           

          以下為應(yīng)用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()用于監(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一般配合需要使用事件,然后由事件進行參數(shù)的綁定.

           

          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

          posted on 2009-09-02 22:31 badqiu 閱讀(1834) 評論(3)  編輯  收藏

          評論

          # re: [設(shè)計模式] AsyncToken模式,替換通常的Listener模式[未登錄]  回復(fù)  更多評論   

          挺不錯的啊,這樣是比listener靈活。
          不過AsyncToken事件播發(fā)那里可以使用模板方法,以避免token.setComplete()的調(diào)用
          2009-09-03 10:56 | alan

          # re: [設(shè)計模式] AsyncToken模式,替換通常的Listener模式  回復(fù)  更多評論   

          不錯啊,又學習了一種.
          2009-09-04 21:38 | powshow

          # re: [設(shè)計模式] AsyncToken模式,替換通常的Listener模式  回復(fù)  更多評論   

          一直支持樓主的rapid-framework.
          2009-09-06 14:41 | sundy

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 蓝田县| 赣州市| 西乡县| 威远县| 天柱县| 黄浦区| 莎车县| 简阳市| 砚山县| 浙江省| 蕲春县| 丹寨县| 武宁县| 贵溪市| 蕉岭县| 富源县| 迁西县| 疏附县| 安图县| 昌图县| 肥东县| 合肥市| 赤城县| 湾仔区| 成都市| 许昌市| 故城县| 庆阳市| 普宁市| 扎赉特旗| 邓州市| 永嘉县| 荔波县| 克拉玛依市| 柏乡县| 武义县| 汕尾市| 定结县| 昭苏县| 乌兰察布市| 灌阳县|