EventBus源码学习,android输入法开发

if (defaultInstance == null) {

synchronized (EventBus.class) {

if (defaultInstance == null) {

defaultInstance = new EventBus();

}

}

}

return defaultInstance;

}

// 调用带参数的构造方法

public EventBus() {

this(DEFAULT_BUILDER);

}

//

EventBus(EventBusBuilder builder) {

//…

subscriptionsByEventType = new HashMap<>();

typesBySubscriber = new HashMap<>();

stickyEvents = new ConcurrentHashMap<>();

mainThreadPoster = new HandlerPoster(this, Looper.getMainLooper(), 10);

backgroundPoster = new BackgroundPoster(this);

asyncPoster = new AsyncPoster(this);

indexCount = builder.subscriberInfoIndexes != null ? builder.subscriberInfoIndexes.size() : 0;

subscriberMethodFinder = new SubscriberMethodFinder(builder.subscriberInfoIndexes,

builder.strictMethodVerification, builder.ignoreGeneratedIndex);

logSubscriberExceptions = builder.logSubscriberExceptions;

logNoSubscriberMessages = builder.logNoSubscriberMessages;

sendSubscriberExceptionEvent = builder.sendSubscriberExceptionEvent;

sendNoSubscriberEvent = builder.sendNoSubscriberEvent;

throwSubscriberException = builder.throwSubscriberException;

eventInheritance = builder.eventInheritance;

executorService = builder.executorService;

}

在EventBus(builder)构造方法里初始化了一些配置信息。

之后调用了EventBus的register(obj)方法,这个方法接收的参数类型是Object。这里我们分步骤1和步骤2去看看做了哪些操作。

public void register(Object subscriber) {

// 通过反射拿到传入的obj的Class对象,如果是在MainActivity里做的注册操作,

// 那subscriber就是MainActivity对象

Class<?> subscriberClass = subscriber.getClass();

// 步骤1

List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);

// 步骤2

synchronized (this) {

for (SubscriberMethod subscriberMethod : subscriberMethods) {

subscribe(subscriber, subscriberMethod);

}

}

}

步骤1

List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);

首先subscriberMethodFinder对象是在EventBus带参数的构造函数里进行初始化的,从这个findSubscriberMethods()方法名就可以看出来,步骤1的是去获取当前注册的对象里所有的被@Subscribe注解的方法集合,那这个List集合的对象SubscriberMethod又是什么东东呢? 我们去看一下

/** Used internally by EventBus and generated subscriber indexes. */

public class SubscriberMethod {

final Method method;

final ThreadMode threadMode;

final Class<?> eventType;

final int priority;

final boolean sticky;

/** Used for efficient comparison */

String methodString;

public SubscriberMethod(Method method, Class<?> eventType, ThreadMode threadMode, int priority, boolean sticky) {

this.method = method;

this.threadMode = threadMode;

this.eventType = eventType;

this.priority = priority;

this.sticky = sticky;

}

}

看完这个类里定义的信息,大概明白了。SubscriberMethod 定义了Method方法名,ThreadMode 线程模型,eventType 事件的class对象,priority是指接收事件的优先级,sticky是指是否是粘性事件,SubscriberMethod 对这些信息做了一个封装。这些信息在我们处理事件的时候都会用到。

好的,知道了SubscriberMethod 是什么东东后,我们直接进入findSubscriberMethods(subscriberClass)方法:

List findSubscriberMethods(Class<?> subscriberClass) {

// METHOD_CACHE是事先定义了一个缓存Map,以当前的注册对象的Class对象为key,注册的对象里所有的被@Subscribe注解的方法集合为value

List subscriberMethods = METHOD_CACHE.get(subscriberClass);

// 第一次进来的时候,缓存里面没有集合,subscriberMethods 为null

if (subscriberMethods != null) {

return subscriberMethods;

}

// ignoreGeneratedIndex是在SubscriberMethodFinder()的构造函数初始化的,默认值是 false

if (ignoreGeneratedIndex) {

// 通过反射去获取

subscriberMethods = findUsingReflection(subscriberClass);

} else {

// 通过apt插件生成的代码。使用subscriber Index生成的SubscriberInfo来获取订阅者的事件处理函数,

subscriberMethods = findUsingInfo(subscriberClass);

}

if (subscriberMethods.isEmpty()) {

throw new EventBusException("Subscriber " + subscribe

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值