EventBus分析--事件的注册

本文详细探讨了EventBus的事件注册过程,包括`findSubscriberMethods`和`subscribe`两个关键步骤。`findSubscriberMethods`通过反射从订阅类中获取所有订阅方法信息,并保存在SubscriberMethod列表中。`subscribe`方法则根据事件类型注册订阅者,确保订阅者按优先级插入,并在必要时分发sticky事件。整个注册过程涉及了订阅者、事件、总线的交互,确保了Android组件间通信的高效与可靠。
摘要由CSDN通过智能技术生成

前言:

EventBus定义:是一个发布 / 订阅的事件总线。

这么说应该包含4个成分:发布者,订阅者,事件,总线。

那么这四者的关系是什么呢?

很明显:订阅者订阅事件到总线,发送者发布事件。

主要用于进程内部组件之间的通信。

EventBus是一个单例模式,在一个进程中只有一个对象, getDefault方法如下,

public static EventBus getDefault() {
        if (defaultInstance == null) {
            synchronized (EventBus.class) {
                if (defaultInstance == null) {
                    defaultInstance = new EventBus();
                }
            }
        }
        return defaultInstance;
    }

使用了双重判断的方式,防止并发的问题,极大的提高了效率。

1,事件注册

调用register方法注册事件, EventBus的register方法如下,

public void register(Object subscriber) {
 Class<?> subscriberClass = subscriber.getClass();
 List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
   synchronized (this) {
      for (SubscriberMethod subscriberMethod : subscriberMethods) {
          subscribe(subscriber, subscriberMethod);
      }
   }
}

获取订阅者的类对象,因为订阅者不是特定类的对象,因此使用Object表示。

1.1 findSubscriberMethods

首先看看SubscriberMethod类的作用,

public class SubscriberMethod {
   final Method method;//方法
   final ThreadMode threadMode;//执行线程
final Class<?> eventType;//接收的事件类型
final int priority;//优先级
   final boolean sticky;
/** Used for efficient comparison */
String methodString;
    ....
 }

SubscriberMethod其实就是一个订阅方法的实体类,里面保存了订阅方法信息.

每一个事件订阅类都对应一个SubscriberMethod list。

 

首先看subscriberMethodFinder.findSubscriberMethods,

该方法的作用其实就是从订阅类中获取所有的订阅方法信息,主要逻辑如下,

1,从METHOD_CACHE MAP中读取对应的SubscriberMethod list,

List<SubscriberMethod> subscriberMethods = METHOD_CACHE.get(subscriberClass);
   if (subscriberMethods != null) {
       return subscriberMethods;
   }

2, 利用反射来获取订阅类中的订阅方法信息

if (ignoreGeneratedIndex) {
     //利用反射来获取订阅类中的订阅方法信息
    subscriberMethods = findUsingReflection(subscriberClass);
  } else {
      //从注解器生成的MyEventBusIndex类中获得订阅类的订阅方法信息
    subscriberMethods = findUsingInfo(subscriberClass);
 }

3,在METHOD_CACHE中保存SubscriberMethod

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值