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让支付触手可及