EventBus3.0源码解析——05. unregister 注销

unregister (注销)

unregister(Object subscriber)

public synchronized void unregister(Object subscriber) {
    //获取当前Subscriber对象所缓存的所有eventType对象
    //这里的eventType代表Subscriber对象中所有标记了@Subscribe的method
    List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
    if (subscribedTypes != null) {
        for (Class<?>Subscription对象 eventType : subscribedTypes) {
            //将当前Subscriber对象中所有的eventType对象解除绑定
            unsubscribeByEventType(subscriber, eventType);
        }
        //清除缓存
        typesBySubscriber.remove(subscriber);
    } else {
        logger.log(Level.WARNING, "Subscriber to unregister was not registered before: " + subscriber.getClass());
    }
}

unsubscribeByEventType()

//将subscriber对象中的某个eventType对象解除绑定,即注销
private void unsubscribeByEventType(Object subscriber, Class<?> eventType) {
    //获得eventbus中缓存的所有标记了eventType的Subscription对象
    List<Subscription> subscriptions = subscriptionsByEventType.get(eventType);
    if (subscriptions != null) {
        int size = subscriptions.size();
        for (int i = 0; i < size; i++) {
            //从中找出与当前subscriber对应的Subscription对象
            Subscription subscription = subscriptions.get(i);
            if (subscription.subscriber == subscriber) {
                //找到了目标Subscription对象,然后解除绑定
                subscription.active = false;
                subscriptions.remove(i);
                i--;
                size--;
            }
        }
    }
}

总结

  1. 注销当前subscriber对象中所有标记了@Subscribe的eventType
  2. 从整个eventbus的缓存中去解除绑定
  3. 逐个eventtype的解除绑定
  4. 循环遍历缓存对象,从中解除绑定
发布了113 篇原创文章 · 获赞 48 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/yehui928186846/article/details/99313218