EventBus源码解析01-获取实例
通常,我们会通过getDefault()来获取EventBus的实例。
EventBus.getDefault()  
我们来查看他内部的实现。
  public static EventBus getDefault() {
    if (defaultInstance == null) {
        synchronized (EventBus.class) {
            if (defaultInstance == null) {
                defaultInstance = new EventBus();
            }
        }
    }
    return defaultInstance;
}  
可以看到,这是个双重校验锁的单例模式,说明通过getDefault()获取的EventBus对象是个单实例。
这里再来看下EventBus的构造方法
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;
}  
这里参数传入了EventBusBuilder对象,很明显,构造方法中会根据EventBusBuilder进行一些变量的初始化。根据Builder这个命名,我们可以猜想到这是个建造者模式。
如果我们需要自定义EventBus,完全可以使用建造者模式构建一个。不过,一般情况下,使用getDefault()完全就足够使用了。
EventBus eventBus = EventBus.builder()
   .eventInheritance(false)
   .sendNoSubscriberEvent(true)
   .skipMethodVerificationFor(MainActivity.class)
   .build();  
至此,EventBus的实例获取就分析完了,下一篇文章,我们将来分析下EventBus的订阅过程。
                    
                
                
            
        
浙公网安备 33010602011771号