EventBus 黏性事件的register

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiey94/article/details/82963818

EventBus 黏性事件的register

跟在普通事件的register后面:

// Must be called in synchronized block
    private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {
        ......
        if (subscriberMethod.sticky) {
            if (eventInheritance) {
                // Existing sticky events of all subclasses of eventType have to be considered.
                // Note: Iterating over all events may be inefficient with lots of sticky events,
                // thus data structure should be changed to allow a more efficient lookup
                // (e.g. an additional map storing sub classes of super classes: Class -> List<Class>).
                Set<Map.Entry<Class<?>, Object>> entries = stickyEvents.entrySet();
                for (Map.Entry<Class<?>, Object> entry : entries) {
                    Class<?> candidateEventType = entry.getKey();
                    if (eventType.isAssignableFrom(candidateEventType)) {
                        Object stickyEvent = entry.getValue();
                        checkPostStickyEventToSubscription(newSubscription, stickyEvent);
                    }
                }
            } else {
                Object stickyEvent = stickyEvents.get(eventType);
                checkPostStickyEventToSubscription(newSubscription, stickyEvent);
            }
        }
    }

只是后面多了这么一段代码;

判断如果是黏性事件,判断是否具有参数继承性(发送一个事件,则该参数类型及其超类/接口的订阅事件都可以收到,默认true);

stickyEvents:Key是事件类型,Value是事件对象;

for循环中获取事件的类型,判断是否事件类型是订阅事件类型的本身或者超类/接口;

这块我说细一点,我自己差点就迷惑了;
假设A跳转到B,跳转之前发送了两个黏性事件;
subscribe是跑在一个for循环里面的,去找B中的所有事件,如果是黏性事件就进来判断该订阅事件参数类型是否是发射的黏性事件本身或者超类/接口,如果是则往下发送,否则忽略;这里就能得出一个结论:

发送的黏性事件,他以及他的父类作为参数类型的订阅方法都可以收的到

例:A extends B,post(A),则event(A)和event(B)都可以收的到

接着往下走:

private void checkPostStickyEventToSubscription(Subscription newSubscription, Object stickyEvent) {
        if (stickyEvent != null) {
            // If the subscriber is trying to abort the event, it will fail (event is not tracked in posting state)
            // --> Strange corner case, which we don't take care of here.
            postToSubscription(newSubscription, stickyEvent, isMainThread());
        }
    }

如果参数对象为空则到此结束,否则继续往下走;

private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
        switch (subscription.subscriberMethod.threadMode) {
            ......
            case MAIN:
                if (isMainThread) {
                    invokeSubscriber(subscription, event);
                } else {
                    mainThreadPoster.enqueue(subscription, event);
                }
                break;
            ......
        }
    }

后面的就和普通事件的订阅方法没有什么异同了;

猜你喜欢

转载自blog.csdn.net/xiey94/article/details/82963818