美文网首页
Android源码学习之EventBus

Android源码学习之EventBus

作者: 麦可西 | 来源:发表于2020-11-17 15:26 被阅读0次
image.png
官方地址: EventBus

EventBus.getDefault()

public class EventBus {
    static volatile EventBus defaultInstance;

    private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
    private static final Map<Class<?>, List<Class<?>>> eventTypesCache = new HashMap<>();

    private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
    private final Map<Object, List<Class<?>>> typesBySubscriber;
    private final Map<Class<?>, Object> stickyEvents;

    //1、单例设计模式返回EventBus对象
    public static EventBus getDefault() {
        EventBus instance = defaultInstance;
        if (instance == null) {
            synchronized (EventBus.class) {
                instance = EventBus.defaultInstance;
                if (instance == null) {
                    //2.调用EventBus构造方法
                    instance = EventBus.defaultInstance = new EventBus();
                }
            }
        }
        return instance;
    }
    
    public EventBus() {
        // 3、调用有参构造方法,传入一个EventBusBuilder对象
        this(DEFAULT_BUILDER);
    }

    EventBus(EventBusBuilder builder) {
        logger = builder.getLogger();

        //这个集合可以根据事件类型获取订阅者
        //key:事件类型,value:订阅该事件的订阅者集合
        subscriptionsByEventType = new HashMap<>();

        //订阅者所订阅的事件集合
        //key:订阅者,value:该订阅者订阅的事件集合
        typesBySubscriber = new HashMap<>();

        //粘性事件集合
        //key:事件Class对象,value:事件对象
        stickyEvents = new ConcurrentHashMap<>();
        //Android主线程处理事件
        mainThreadSupport = builder.getMainThreadSupport();
        mainThreadPoster = mainThreadSupport != null ? mainThreadSupport.createPoster(this) : null;
        //Background事件发送者
        backgroundPoster = new BackgroundPoster(this);
        //Async事件发送者
        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对象,在创建EventBus时最终会调用它的有参构造函数,传入一个EventBus.Builder对象。在这个有参构造函数内部对属性进行初始化,其中有几个比较重要的属性:subscriptionsByEventType、typesBySubscriber、stickyEvents和subscriberMethodFinder,这几个属性的作用已经在注释中给出。

EventBus.getDefault().post(Object event)

public class EventBus {

        private final ThreadLocal<PostingThreadState> currentPostingThreadState = new ThreadLocal<PostingThreadState>() {
        @Override
        protected PostingThreadState initialValue() {
            return new PostingThreadState();
            }
        };

        public void post(Object event) {
        // 1、获取当前线程的PostingThreadState,这是一个ThreadLocal对象
        PostingThreadState postingState = currentPostingThreadState.get();
        List<Object> eventQueue = postingState.eventQueue;
        eventQueue.add(event);

        if (!postingState.isPosting) {
            postingState.isMainThread = isMainThread();
            postingState.isPosting = true;
            if (postingState.canceled) {
                throw new EventBusException("Internal error. Abort state was not reset");
            }
            try {
                while (!eventQueue.isEmpty()) {
                    postSingleEvent(eventQueue.remove(0), postingState);
                }
            } finally {
                postingState.isPosting = false;
                postingState.isMainThread = false;
            }
        }
    }
}

相关文章

网友评论

      本文标题:Android源码学习之EventBus

      本文链接:https://www.haomeiwen.com/subject/rtgxiktx.html