ITPub博客

首页 > IT职业 > IT职场 > EventBus设计之禅

EventBus设计之禅

IT职场 作者:mocow 时间:2021-09-09 09:18:55 0 删除 编辑

今日科技快讯


据国外媒体报道,滴滴已获准在美国加利福尼亚州测试自动驾驶汽车。加州监管部门网站显示,DiDi Research America LLC已获批准,可在加州公共道路上测试自动驾驶汽车(需配备司机)。这是第53家获得测试许可的公司,此前,特斯拉、福特、苹果等许多公司已拿到牌照。


作者简介


本篇来自  jokermonn 的投稿,分享了他对 EventBus 源码的理解以及为什么要这么设计的感悟,一起来看看!希望大家喜欢。

 jokermonn  的博客地址:

https://juejin.im/user/57201bb479bc440066b06ee4


前言


笔者看过一些知名开源项目的源码,认为 EventBus 算是其中最简单的,甚至复杂程度不在一个级别上。解析源码前先提一下以下几个变量和类,掌握了这些变量和类基本上 EventBus 已经就掌握一半了。

  • METHOD_CACHE:Map, List> 类型。键为注册类的 Class,值为该类中所有 EventBus 回调的方法链表(也就是被 @Subscribe 标记的方法们)。

  • Subscription 类(文中称订阅信息):关注类中两个字段,一个是 Object 类型的 subscriber,该字段即为注册的对象(在 Android 中时常为 Activity);另一个是 SubscriberMethod 类型的 subscriberMethod,细节如下。

  • subscriberMethod:SubscriberMethod 类型(文中称订阅方法)。关注类中有个字段 eventType 是 Class> 类型,代表 Event 的类类型。

  • typesBySubscriber:Map>> 类型。键为对象本身(注意:并非其 Class 对象),值为该对象中所有的 Event 的类型链表。该字段只用于仅用于判断某个对象是否注册过,在日常使用中几乎没什么作用。

  • subscribtionsByEventType:Map, CopyonWriteArrayList> 类型。键为 Event 类型,值为元素为 Subscription(订阅信息)链表。核心字段。


Register


直接查看 EventBus#register() 源码:

public void register(Object subscriber) {
   Class> subscriberClass = subscriber.getClass();
   // 根据当前注册类获取 List
   List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
   synchronized (this) {
       for (SubscriberMethod subscriberMethod : subscriberMethods) {
           // subsciber 对 List 中每个 SubscriberMethod 进行订阅
           subscribe(subscriber, subscriberMethod);
       }
   }
}

原文出处

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2815/viewspace-2802091/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-17

  • 博文量
    108
  • 访问量
    1364