<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

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


    網站導航:
     
    主站蜘蛛池模板: 国产一区视频在线免费观看| 亚洲中文字幕无码av永久| 国产精品无码免费视频二三区| 97在线视频免费公开视频| 中文字幕乱码亚洲无线三区| 久久精品国产亚洲av日韩| 亚洲综合另类小说色区| 又大又黄又粗又爽的免费视频 | 成人免费午夜视频| 久久久久久国产精品免费免费男同 | 黄网站色视频免费看无下截| 亚洲中文精品久久久久久不卡| 亚洲欧洲第一a在线观看| 国产亚洲美女精品久久久2020| 国产一级做a爱免费视频| 久久精品女人天堂AV免费观看| 四虎成年永久免费网站| 十九岁在线观看免费完整版电影| 97在线免费视频| a毛片免费观看完整| 国产精品福利在线观看免费不卡| 美女免费视频一区二区三区| 亚洲av无码日韩av无码网站冲| 亚洲三级视频在线| 亚洲一卡2卡3卡4卡国产网站| 亚洲精品视频在线观看免费| 亚洲ⅴ国产v天堂a无码二区| 亚洲成AV人在线观看天堂无码| 国产成人综合亚洲AV第一页 | 亚洲欧美日韩中文字幕一区二区三区| 亚洲电影唐人社一区二区| 亚洲视频在线观看网站| 久久亚洲AV成人无码软件| 91在线精品亚洲一区二区| 亚洲黑人嫩小videos| 亚洲白色白色永久观看| 亚洲色图激情文学| 欧美日韩亚洲精品| 羞羞视频免费网站含羞草| 男女啪啪免费体验区| 国产无限免费观看黄网站|