Listener 模式的局限
- Service 方法多導致事件類型膨脹,Listener 需處理過多事件
- 監聽器需預先註冊,無法在調用過程中動態新增
- 處理「發送失敗重試」等場景時邏輯彆扭
AsyncToken 核心優勢
- Token 可無限傳遞:任何對結果感興趣的組件均可註冊回調
- 擁有上下文:閉包捕獲調用參數,支援重試等業務邏輯
- 一 Token 對應一調用:無需事件類型區分,天然綁定特定調用
- 靈活轉換:可再轉發給 Listener 以事件形式分發
實戰代碼範例
public void testSendEmail() {
final String address = "badqiu@gmail.com";
final String subject = "test";
final String content = "async token test";
// 返回 token,含 addResponder() 註冊回調
AsyncToken token = sendAsyncEmail(address, subject, content);
// 外部組件可繼續註冊監聽
token.addResponder(new IResponder() {
public void onFault(Exception fault) {
System.out.println("email send fail, cause: " + fault);
// 直接引用上下文參數進行重試
sendAsyncEmail(address, subject, content);
}
public void onResult(Object result) {
System.out.println("email send success, result: " + result);
}
});
}
public AsyncToken sendAsyncEmail(String address, String subject, String content) {
final AsyncToken token = new AsyncToken();
new Thread(new Runnable() {
public void run() {
try {
// do send email job...
Object executeResult = "success";
token.setComplete(executeResult); // 通知完成
} catch (Exception e) {
token.setFault(e); // 通知失敗
}
}
}).start();
return token;
}
與 Listener 模式對比