【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
【摘要】
文章目录
一、根据事件类型获取订阅者二、调用订阅方法
一、根据事件类型获取订阅者
接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对...
一、根据事件类型获取订阅者
接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) ;
通过事件类型到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType
集合中查找相应的 订阅对象 + 订阅方法 ;
获取事件类型 :
// 获取事件类型
Class<?> eventType = event.getClass();
- 1
- 2
Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType
集合中查找事件类型对应的订阅者 ;
// 获取事件类型对应的 订阅者 集合
CopyOnWriteArrayList<MySubscription> subscriptions =
subscriptionsByEventType.get(eventType);
- 1
- 2
- 3
遍历并调用订阅者 :
// 确保订阅者大于等于 1 个
if (subscriptions != null && subscriptions.size() > 0) {
// 遍历订阅者并调用订阅方法
for (MySubscription subscription : subscriptions) {
postSingleSubscription(subscription, event);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
部分代码示例 :
/**
* 接收到了 发布者 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);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
二、调用订阅方法
通过反射调用订阅方法 ;
在 MySubscription
中封装了 订阅者对象 和 订阅方法 , 订阅方法中封装了 Method
方法 ;
直接调用 Method
对象的 invoke
方法 , 通过反射调用订阅方法 , 传入的第一个参数是 订阅者对象 , 即订阅方法所在的对象 , 传入的第二个参数是 订阅方法接收的事件参数对象 ;
/**
* 调用订阅者的订阅方法
* @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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/120521253
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)