【EventBus】事件通信框架 ( 发送事件

【EventBus】事件通信框架 ( 发送事件

文章目录一、根据事件类型获取订阅者二、调用订阅方法一、根据事件类型获取订阅者接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) ;

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

获取事件类型 :

代码语言:javascript复制 // 获取事件类型

Class eventType = event.getClass();Map, CopyOnWriteArrayList> subscriptionsByEventType 集合中查找事件类型对应的订阅者 ;

代码语言:javascript复制 // 获取事件类型对应的 订阅者 集合

CopyOnWriteArrayList subscriptions =

subscriptionsByEventType.get(eventType);遍历并调用订阅者 :

代码语言:javascript复制 // 确保订阅者大于等于 1 个

if (subscriptions != null && subscriptions.size() > 0) {

// 遍历订阅者并调用订阅方法

for (MySubscription subscription : subscriptions) {

postSingleSubscription(subscription, event);

}

}部分代码示例 :

代码语言:javascript复制 /**

* 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象

* 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 )

* 通过事件类型到

* Map, CopyOnWriteArrayList> subscriptionsByEventType

* 集合中查找相应的 订阅对象 + 订阅方法

* @param event

*/

public void post(Object event) {

// 获取事件类型

Class eventType = event.getClass();

// 获取事件类型对应的 订阅者 集合

CopyOnWriteArrayList 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();

}

}

相关推荐

嘮字的意思
在哪个应用商店能下载365

嘮字的意思

📅 09-11 👁️ 5700
正史上的吕布,最终究竟是怎么死的?吕布为什么会命殒白门楼?
在哪个应用商店能下载365

正史上的吕布,最终究竟是怎么死的?吕布为什么会命殒白门楼?

📅 07-28 👁️ 6686
圣邦股份2024年报暨2025一季报业绩交流会20250430
在哪个应用商店能下载365

圣邦股份2024年报暨2025一季报业绩交流会20250430

📅 09-11 👁️ 9622
灵曦名字的含义是什么意思
365bet中文官网

灵曦名字的含义是什么意思

📅 07-23 👁️ 8296