【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(一)

简介: 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(一)

文章目录

一、取消注册订阅者

二、完整代码示例





一、取消注册订阅者


取消注册操作 : 从 Map<Object, List<Class<?>>> typesBySubscriber 集合中获取 订阅者对象 中的 订阅方法 参数集合 ; 然后再到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中获取 订阅方法参数类型 对应的 CopyOnWriteArrayList<MySubscription>> 集合 , MySubscription 中封装了 订阅者对象 + 订阅方法 , 删除相应的订阅者即可 ;


1. 获取参数类型集合 : 从 Map<Object, List<Class<?>>> typesBySubscriber 集合中获取 订阅者对象 中的 订阅方法 参数集合 ;


   

// 首先获取 订阅者 对象中的订阅方法的参数集合
        List<Class<?>> types = typesBySubscriber.get(subscriber);


2. 获取参数类型对应的订阅者集合 : 到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中获取 订阅方法参数类型 对应的 CopyOnWriteArrayList<MySubscription>> 集合 ;


       

// 获取 接收 type 事件类型的 订阅者集合
            //      MySubscription 中封装了订阅者对象 + 订阅方法
            CopyOnWriteArrayList<MySubscription> subscriptions =
                    subscriptionsByEventType.get(type);


3. 移除符合条件的订阅者 : 遍历上述订阅者集合 , 判定 CopyOnWriteArrayList<MySubscription> 集合中的 MySubscription 元素 , 如果如果 封装类对象 中的 订阅者对象 与 本次取消注册的订阅者对象相同 , 则从集合中移除该订阅者 ;


       

// 判定 CopyOnWriteArrayList<MySubscription> 集合中的 MySubscription 元素
            //      如果如果 封装类对象 中的 订阅者对象 与 本次取消注册的订阅者对象相同 , 则从集合中移除该订阅者
            // 记录集合大小
            int subscriptionsSize = subscriptions.size();
            for (int i = 0; i < subscriptionsSize; i++) {
                // 获取 订阅者对象 + 订阅方法 封装类 对象
                MySubscription subscription = subscriptions.get(i);
                // 如果 封装类对象 中的 订阅者对象 与 本次取消注册的订阅者对象相同
                //      将其从该集合中删除
                if (subscription.getSubscriber() == subscriber) {
                    // 删除 i 索引元素
                    subscriptions.remove(i);
                    // 应用新的集合大小 , 集合少了一个元素
                    subscriptionsSize--;
                    // 第 i 个元素被删除了 , 之后会自增遍历下一个元素
                    //      下一次遍历的还是第 i 个元素
                    //      由于后面循环操作需要自增 , 想要之后仍然遍历第 i 个元素 ,
                    //      这里对 i 进行自减操作
                    i--;
                }
            }
            // 删除了订阅者 , 就完成了取消注册操作



部分代码示例 :


 

/**
     * 取消注册
     *      从 Map<Object, List<Class<?>>> typesBySubscriber 集合中获取
     *      订阅者对象 中的 订阅方法 参数集合
     *
     *      然后再到
     *      Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType
     *      集合中获取 订阅方法参数类型 对应的 CopyOnWriteArrayList<MySubscription>> 集合
     *      MySubscription 中封装了 订阅者对象 + 订阅方法
     * @param subscriber
     */
    public void unregister(Object subscriber) {
        // 首先获取 订阅者 对象中的订阅方法的参数集合
        List<Class<?>> types = typesBySubscriber.get(subscriber);
        // 遍历参数类型
        for (Class<?> type: types) {
            // 获取 接收 type 事件类型的 订阅者集合
            //      MySubscription 中封装了订阅者对象 + 订阅方法
            CopyOnWriteArrayList<MySubscription> subscriptions =
                    subscriptionsByEventType.get(type);
            // 判定 CopyOnWriteArrayList<MySubscription> 集合中的 MySubscription 元素
            //      如果如果 封装类对象 中的 订阅者对象 与 本次取消注册的订阅者对象相同 , 则从集合中移除该订阅者
            // 记录集合大小
            int subscriptionsSize = subscriptions.size();
            for (int i = 0; i < subscriptionsSize; i++) {
                // 获取 订阅者对象 + 订阅方法 封装类 对象
                MySubscription subscription = subscriptions.get(i);
                // 如果 封装类对象 中的 订阅者对象 与 本次取消注册的订阅者对象相同
                //      将其从该集合中删除
                if (subscription.getSubscriber() == subscriber) {
                    // 删除 i 索引元素
                    subscriptions.remove(i);
                    // 应用新的集合大小 , 集合少了一个元素
                    subscriptionsSize--;
                    // 第 i 个元素被删除了 , 之后会自增遍历下一个元素
                    //      下一次遍历的还是第 i 个元素
                    //      由于后面循环操作需要自增 , 想要之后仍然遍历第 i 个元素 ,
                    //      这里对 i 进行自减操作
                    i--;
                }
            }
            // 删除了订阅者 , 就完成了取消注册操作
        }
    }



目录
相关文章
|
10月前
页面第二次进入或者多次进入,事件总线触发事件多次,eventBus触发多次
页面第二次进入或者多次进入,事件总线触发事件多次,eventBus触发多次
|
9月前
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
53 0
|
开发工具 开发者
消息服务-事件通知使用 | 学习笔记
快速学习消息服务-事件通知使用
109 0
消息服务-事件通知使用 | 学习笔记
|
消息中间件 调度
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
135 0
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(二)
【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )(二)
99 0
【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
116 0
【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
109 0
|
缓存
【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
203 0
|
缓存
【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )(二)
【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )(二)
118 0