前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )

【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )

作者头像
韩曙亮
发布2023-03-29 18:08:52
5280
发布2023-03-29 18:08:52
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、根据事件类型获取订阅者


接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) ;

通过事件类型到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找相应的 订阅对象 + 订阅方法 ;

获取事件类型 :

代码语言:javascript
复制
        // 获取事件类型
        Class<?> eventType = event.getClass();

Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找事件类型对应的订阅者 ;

代码语言:javascript
复制
        // 获取事件类型对应的 订阅者 集合
        CopyOnWriteArrayList<MySubscription> subscriptions =
                subscriptionsByEventType.get(eventType);

遍历并调用订阅者 :

代码语言:javascript
复制
        // 确保订阅者大于等于 1 个
        if (subscriptions != null && subscriptions.size() > 0) {
            // 遍历订阅者并调用订阅方法
            for (MySubscription subscription : subscriptions) {
                postSingleSubscription(subscription, event);
            }
        }

部分代码示例 :

代码语言:javascript
复制
    /**
     * 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象
     *      将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 )
     *      通过事件类型到
     *      Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType
     *      集合中查找相应的 订阅对象 + 订阅方法
     * @param event
     */
    public void post(Object event) {
        // 获取事件类型
        Class<?> eventType = event.getClass();
        // 获取事件类型对应的 订阅者 集合
        CopyOnWriteArrayList<MySubscription> subscriptions =
                subscriptionsByEventType.get(eventType);

        // 确保订阅者大于等于 1 个
        if (subscriptions != null && subscriptions.size() > 0) {
            // 遍历订阅者并调用订阅方法
            for (MySubscription subscription : subscriptions) {
                postSingleSubscription(subscription, event);
            }
        }
    }

二、调用订阅方法


通过反射调用订阅方法 ;

MySubscription 中封装了 订阅者对象 和 订阅方法 , 订阅方法中封装了 Method 方法 ;

直接调用 Method 对象的 invoke 方法 , 通过反射调用订阅方法 , 传入的第一个参数是 订阅者对象 , 即订阅方法所在的对象 , 传入的第二个参数是 订阅方法接收的事件参数对象 ;

代码语言:javascript
复制
    /**
     * 调用订阅者的订阅方法
     * @param subscription 订阅者对象 + 订阅方法
     * @param event 发布者传递的消息事件
     */
    private void invokeMethod(MySubscription subscription, Object event) {
        try {
            // 通过反射调用订阅方法
            subscription.getSubscriberMethod().getMethod().invoke(
                    subscription.getSubscriber(),   // 订阅者对象
                    event                           // 事件参数类型
            );
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、根据事件类型获取订阅者
  • 二、调用订阅方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档