统一管理项目中的接口回调

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android机动车

Dagger2系列——实例解析

这篇文章会分享一下实际应用中的Dagger2如何使用,以及Dagger2通过apt插件如何给我们生成代码,以及生成的代码之间的关联。

982
来自专栏向治洪

Universal Image Loader for Android 使用实例

<span style="white-space:pre">      </span>// 1.获取ImageLoader实例         ImageLo...

22910
来自专栏Android先生

Android官方MVP架构项目解析

前段时间Google在Github开源了一个项目Android Architecture Blueprints,在项目中展示了使用不同的实现架构和工具来实现相同...

1063
来自专栏KK的小酒馆

Service的跨进程开发Android开发高级进阶

Service的跨进程通信主要由两种Android提供的方法进行,一个是AIDL,通过创建一个AIDL文件来完成,另一个是利用Messenger,发送Messa...

1242
来自专栏程序员互动联盟

【专业技术】Android内存泄漏简介

存在问题: 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。 解决方案: 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它...

2893
来自专栏Android知识点总结

O1-开源框架使用之EventBus

说明使用POSTING,发布与订阅在同一个线程,也就是子线程,更新UI会崩 说明使用MAIN,不管发布者在哪,订阅者都在main线程,可更新UI,但不能耗时操...

1052
来自专栏猿湿Xoong

Android 8.0 SystemUI(四):二说顶部 StatusBar

大家好,我是ptt,本篇是 SystemUI 的第四篇,也是 StatusBar 的第二说。

1K4
来自专栏7号代码

Android网络与数据存储——File存储(实现SD卡文件浏览器)

AndroidManifest.xml中manifest标签下有一个属性android:installLocation,用于指定应用程序安装在什么地方,该属性有...

2773
来自专栏Android相关

AAC---LiveData

LiveData是一个与Activity/Fragment生命周期相关(lifecycle-aware)的Observer类。而这种相关性(awareness ...

1052
来自专栏码农笔录

Android全能开源项目xUtils3开发教程、简单封装

1622

扫码关注云+社区

领取腾讯云代金券