EventBus 普通事件的unregister

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

EventBus 普通事件的unregister

/** Unregisters the given subscriber from all event classes. */
    public synchronized void unregister(Object subscriber) {
        List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
        if (subscribedTypes != null) {
            for (Class<?> eventType : subscribedTypes) {
                unsubscribeByEventType(subscriber, eventType);
            }
            typesBySubscriber.remove(subscriber);
        } else {
            logger.log(Level.WARNING, "Subscriber to unregister was not registered before: " + subscriber.getClass());
        }
    }

根据订阅者找到所有的订阅类型,如果找不到则抛异常,你咋没注册呢?

找到之后则遍历所有的参数类型进行取消订阅处理;

unsubscribeByEventType(subscriber, eventType);

并在map中删除该订阅者(也就是typesBySubscriber,typesBySubscriber是啥?看名字,订阅者作为Key,订阅者中所有的订阅方法的参数类型装载的List作为Value)

/** Only updates subscriptionsByEventType, not typesBySubscriber! Caller must update typesBySubscriber. */
    private void unsubscribeByEventType(Object subscriber, Class<?> eventType) {
        List<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
        if (subscriptions != null) {
            int size = subscriptions.size();
            for (int i = 0; i < size; i++) {
                Subscription subscription = subscriptions.get(i);
                if (subscription.subscriber == subscriber) {
                    subscription.active = false;
                    subscriptions.remove(i);
                    i--;
                    size--;
                }
            }
        }
    }

根据参数类型,找到所有的订阅者方法;然后找出是当前订阅者的订阅者方法,将订阅者方法设置为解注册,同时从该参数类型的所有订阅者方法的List中移除属于该订阅者的订阅者方法;

啥叫订阅者方法(订阅者subscriber+subscriberMethod组装的Subscription,Subscription就是我取名的订阅者方法);

猜你喜欢

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