Android必知必会EventBus之解注册和总结

159 阅读1分钟
原文链接: www.jianshu.com

第一次分析源码,代码讲解比较简单和抽象。也没有太多的个人总结。慢慢来,技术在提升,话语在总结。这是EventBus的最后一篇,望各位好友多多指导和文章尾部点个喜欢,支持支持,才有动力继续祸害。
相关文章:
Android必知必会EventBus之使用篇
Android必知必会EventBus源码分析之注册
Android必知必会EventBus源码分析之发布事件
EventBus的解注册一行代码:
EventBus.getDefault().unregister(this);
让我们一起看看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());
        }
    }

unregister方法中,主要调用了unsubscribeByEventType方法

/** 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--;
                }
            }
        }
    }

通过代码,解注册是比较简单的,就是把SubscriptionsubscriptionsByEventType进行移除。

完结:

  • EventBus的核心是通过寻找订阅方法的过程,并封装成Subscripition保存起来。在发布事件通过事件类型在subscriptionsByEventType查找Subscripition,并通过反射机制调用订阅方法。
  • EvetntBus通过反射机制来实现,在某种定义上,是很好性能的。但EventBus内容作了很多性能优化处理。例如METHOD_CACHE缓存订阅方法。
  • EventBus使用简单,代码简洁,很多命名规范见名思意。
  • 设计思想,如单例模式观察模式
    点个喜欢呗