EventBus3.0源码解析——02. init 初始化

init(初始化)

getDefault()

//volatile关键字在java并发编程中常用,比synchronized的开销成本要小,轻便
//作用是线程能访问共享变量
//共享变量包括所有的实例变量,静态变量和数组元素,他们都存放在堆内存中
static volatile EventBus defaultInstance;
//一个双重锁定的单例
public static EventBus getDefault() {
    if (defaultInstance == null) {
        synchronized (EventBus.class) {
            if (defaultInstance == null) {
                defaultInstance = new EventBus();
            }
        }
    }
    return defaultInstance;
}

//构造方法
public EventBus() {
    this(DEFAULT_BUILDER);//默认构造器
}
//默认构造器的初始化
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
//初始化是一个空构造方法
EventBusBuilder() {
}

EventBus(EventBusBuilder)

//构造方法,里面会初始化一些基础变量。
//使用Builder设计模式,可以生成定制的EventBus单例,或者默认的EventBus单例。
EventBus(EventBusBuilder builder) {
	logger = builder.getLogger();
	//特定的订阅者与之对应的所有需要接收订阅它的方法map
	subscriptionsByEventType = new HashMap<>();
	//object对应的它之下的所有订阅者map
	typesBySubscriber = new HashMap<>();
	//粘性事件存储map
	stickyEvents = new ConcurrentHashMap<>();
	mainThreadSupport = builder.getMainThreadSupport();
    //用于post非ui线程的订阅事件,切换到主线程,对应ThreadMode.Main
	mainThreadPoster = mainThreadSupport != null ? mainThreadSupport.createPoster(this) : null;
    //用于在后台线程发送订阅事件,对应ThreadMode.BACKGROUND
	backgroundPoster = new BackgroundPoster(this);
    //用于后台异步线程发送订阅事件,对应ThreadMode.ASYNC
	asyncPoster = new AsyncPoster(this);
	indexCount = builder.subscriberInfoIndexes != null ? builder.subscriberInfoIndexes.size() : 0;
    //*订阅者方法查找类
	subscriberMethodFinder = new SubscriberMethodFinder(builder.subscriberInfoIndexes,
                builder.strictMethodVerification, builder.ignoreGeneratedIndex);//1
	logSubscriberExceptions = builder.logSubscriberExceptions;
	logNoSubscriberMessages = builder.logNoSubscriberMessages;
	sendSubscriberExceptionEvent = builder.sendSubscriberExceptionEvent;
	sendNoSubscriberEvent = builder.sendNoSubscriberEvent;
	throwSubscriberException = builder.throwSubscriberException;
	eventInheritance = builder.eventInheritance;
	executorService = builder.executorService;
}

总结

eventbus的初始化工作大致为:

  1. 创建一个eventbus的单例
  2. 构造方法中初始化各种对象(重要的几个初始化对象)
    1. Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType
      1. 该map保存的是object的class对象下所有的标记了@Subscribe成为订阅者的Subscription对象
    2. Map<Object, List<Class<?>>> typesBySubscriber
      1. 该map保存的是Subscription的class对象下所有的接收的参数的class的集合
      2. 因为一个Subscription对象的方法名可能会重复,但是参数不能重复,eventbus靠的是方法的参数来区分,所以一个相同的方法名下会有很多种不同的参数,所以这里一个Subscription对应多个type的class对象
    3. mainThreadSupport
      1. 往主线程发送订阅消息的实现,类似于实现了Handler与Message再Looper中的消息传递
    4. mainThreadPoster
      1. 将需要发送的订阅消息加入到待发送队列,以便发送消息使用
    5. subscriberMethodFinder
      1. 查找Subscription对象下所有标记过的方法,用于发送消息。里面包含了一些方法
        1. List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
          1. 通过Subscription对象的class类找到当前Subscription对象所标记的所有SubscriberMethod对象,就相当与该方法记录了一个被标记了@Subscribe注解的方法集合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值