<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    badqiu

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

    [設計模式] 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

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

    評論

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

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

    # re: [設計模式] AsyncToken模式,替換通常的Listener模式  回復  更多評論   

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

    # re: [設計模式] AsyncToken模式,替換通常的Listener模式  回復  更多評論   

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲黄网站wwwwww| 亚洲日韩AV一区二区三区四区| 久久免费区一区二区三波多野| 亚洲精品在线免费看| 日本免费人成黄页在线观看视频| 黄色三级三级三级免费看| 无码专区—VA亚洲V天堂| 四虎免费在线观看| 在线看片免费人成视频福利| 国产v亚洲v天堂a无| 亚洲午夜激情视频| 91在线视频免费看| 国产免费播放一区二区| 亚洲中文字幕AV每天更新| 亚洲国产精品一区二区成人片国内| 久久99九九国产免费看小说| a一级毛片免费高清在线| 亚洲乱码在线卡一卡二卡新区| 亚洲人成精品久久久久| 日韩特黄特色大片免费视频| 一级毛片全部免费播放| 男人和女人高潮免费网站| 亚洲人成在线中文字幕| 亚洲精品乱码久久久久久蜜桃不卡| 在线观看免费人成视频色| 免费无码作爱视频| 免费国产污网站在线观看不要卡 | 亚洲国产精品美女| 久久精品国产精品亚洲下载| 成人午夜性A级毛片免费| 免费无码VA一区二区三区| 香蕉免费在线视频| 免费夜色污私人影院网站电影| 亚洲噜噜噜噜噜影院在线播放| 亚洲AV无码精品色午夜在线观看| 免费一级毛片不卡不收费| 久久久www成人免费毛片| 久久A级毛片免费观看| 91成人免费观看在线观看| 黄色免费网址大全| 久久久久亚洲国产AV麻豆|