統一管理專案中的介面回撥

weixin_34019929發表於2017-07-30

0、寫在前面

無論是 Java Web 開發還是 Android 開發我們都避免不了非同步處理業務的邏輯。有非同步的出現一定就有非同步結果(介面)的回撥。你之前是不是有為每一個非同步業務都單獨寫一個介面呢?如果沒有單獨寫,可以忽略此篇文件。(你已經是大佬了)
專案(業務)大(複雜)了是不是覺得介面太多難以管理呢?本篇文章就是為了解決此問題。

1、封裝全域性的回撥介面

涉及到的姿勢
1、泛型靈活使用
2、執行緒安全的單例模式
3、WeakHashMap 弱鍵值對引用快取回撥介面

/**
 * 非同步回撥(結果)介面
 */
public interface IGlobalCallback<T> {
    void executeCallback(@Nullable T args);
}
/**
 * 統一管理專案中的回撥
 */
public class CallbackManager {
    private static final WeakHashMap<Object, IGlobalCallback> CALLBACKS = new WeakHashMap<>();

    /**
     * 靜態類部類實現單例
     */
    private static class Holder {
        private static final CallbackManager INSTANCE = new CallbackManager();
    }

    public static CallbackManager getInstance() {
        return Holder.INSTANCE;
    }

    /**
     * 新增全域性回撥
     * @param tag
     * @param callback
     * @return
     */
    public CallbackManager addCallback(Object tag, IGlobalCallback callback) {
        CALLBACKS.put(tag, callback);
        return this;
    }

    /**
     * 獲取指定回撥的介面
     * @param tag
     * @return
     */
    public IGlobalCallback getCallback(Object tag) {
        return CALLBACKS.get(tag);
    }
}
/**
 * 回撥Key的列舉,方便存取回撥介面
 */
public enum CallbackType {
    WX_PAY,
    ALI_PAY
}

2、測試介面回撥

@OnClick(R.id.id_icon_ib)
    void  iconButton(){
        Toast.makeText(getApplicationContext(), "iconButton", Toast.LENGTH_SHORT).show();
        //先全域性CallbackManager中新增回撥
        CallbackManager.getInstance().addCallback(CallbackType.WX_PAY, new IGlobalCallback<String>() {
            @Override
            public void executeCallback(@Nullable String args) {
                Toast.makeText(getApplicationContext(), args, Toast.LENGTH_SHORT).show();
            }
        });
        
        //延遲傳送訊息模擬非同步耗時操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                IGlobalCallback callback = CallbackManager.getInstance().getCallback(CallbackType.WX_PAY);
                if (callback !=null){
                    callback.executeCallback("微信支付測試回撥");
                }
            }
        },3000);
    }

更過多好玩炫酷的封裝參考視訊:http://coding.imooc.com/class/116.html

推薦閱讀
android-iconify 使用詳解
10分鐘用Jitpack釋出開源庫
微信、支付寶App支付
IJPay讓支付觸手可及

相關文章