天天看點

java 中的異步回調

java 中的異步回調

異步回調,本來在c#中是一件極為簡單和優雅的事情,想不到在java的世界裡,卻如此煩瑣,先看下類圖:

java 中的異步回調

先定義了一個CallBackTask,做為外層的面子工程,其主要工作為start 開始一個異步操作,然而真正幹活的是CallBackBody,它裡面的execute才是真正要處理的事情,如果成功,則觸發onSucess,否則觸發onFailure。

CallBackApp做為最終的運作舞台,這裡面還得單獨跑一個線程,來啟動CallBackTask,這樣才不會阻塞後面的處理。

CallBackBody:

package com.cnblogs.yjmyzz.test.callback;


public abstract class CallBackBody {

    void onSuccess(Object context) {
        System.out.println("onSuccess");
    }

    void onFailure(Object context) {
        System.out.println("onFailure");
    }

    abstract void execute(Object context) throws Exception;
}
      

CallBackTask:

package com.cnblogs.yjmyzz.test.callback;

public class CallBackTask {
    private CallBackBody body;

    public CallBackTask(CallBackBody body) {
        this.body = body;
    }

    protected void start(final Object context) {
        final Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    body.execute(context);
                } catch (Exception e) {
                    e.printStackTrace();
                    body.onFailure(context);
                }
                body.onSuccess(context);
            }
        });
        t.start();
    }
}
      

最後測試一把:

CallBackApp:

package com.cnblogs.yjmyzz.test.callback;


/**
 * Created by jimmy on 8/13/15.
 */
public class CallBackApp {

    public static void main(String[] args) {

        System.out.println("準備開始執行異步任務...");

        final Object context = "上下文資訊";

        new CallBackTask(new CallBackBody() {
            @Override
            void execute(Object context) throws Exception {
                System.out.println("\n正在執行耗時操作...");
                System.out.println(context);
                Thread.sleep(5000);
                System.out.println("\n執行完成!");
            }

            void onSuccess(Object context) {
                System.out.println("\n成功後的回調函數...");
                System.out.println(context);
            }

            void onFailure(Object context) {
                System.out.println("\n失敗後的回調函數...");
                System.out.println(context);
            }
        }).start(context);

        System.out.println("\n異步任務已經開始,請等待完成...");
    }
}
      

運作結果:

準備開始執行異步任務...

正在執行耗時操作...

上下文資訊

異步任務已經開始,請等待完成...

執行完成!

成功後的回調函數...

作者:菩提樹下的楊過

出處:http://yjmyzz.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。