異步回調,本來在c#中是一件極為簡單和優雅的事情,想不到在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
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。