美文网首页开源库
Otto 与 EventBus

Otto 与 EventBus

作者: 卡路fly | 来源:发表于2020-05-22 18:45 被阅读0次

Otto 与 EventBus

这两个框架的实现原理差不多, 在开发中常用 Otto.

我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现? 可 以使用的是广播接收器 BroadCastReceiver,在接收和发送消息的时候就不停去发 送广播,然后在需要实时更新的地方进行接收更新。实现的思想比较简单,也不存在代码上的耦合问题,但是有个弊端。
弊端就是需要去在很多地方实现 BroadCastRecevier,代码虽不算冗余,但比较多,看起来很是不爽。

使用 Otto 能解决代码体积的问题。Otto 是一款目前比较流行事件总线框架,旨在保持应用各页面和模块之间通信高效的前提下,对应用进行解耦。Otto 是基于观察者设计模式,简单来说,如果你想订阅某个消息,使用@Subcribe 注解即可进行 接收,同时使用
Bus.post(Object obj)进行消息的发布,这样的设计达到了完全的解耦。

Otto的使用

1.Bus 实例化

Bus 这个类是整个框架的灵魂,它负责消息的发布和接收,整个流程都是经过这个 Bus 去实现的。Bus 的实例化推荐使用单例,就是说整个应用内只实例化一个 Bus 对象,所有的消息的处理都是经过这单一的实例去实现。因为要实现消息的 接受者接收到发布的消息,一定要经过同一个 Bus 对象的处理。Bus 的构造器可 以接收 ThreadEnforcer 类型的参数,ThreadEnforcer 其实是一个接口, 它自身 有两个实现,分别表示 Bus 运行在 Main Thread 中还是异步线程中。

2. 注册和解绑 Bus

根据具体的业务需求进行 Bus 的注册和解绑,对于 android 中的组件,一般是 基于生命周期方法中去实现;同时如果是任意你自定义的类中都可以进行。下面 展示的是在 Activity 和 Fragment 里面实现。

3. 消息的发布 发布消息是整个框架中最重要的部分,它允许你告诉所有的订阅者一个事件已经 触发。任何一个类的实例对象都可以通过总线 Bus 去发布,同时也只能被订阅 这种对象的接受者所接收。下面展示的是通过 Bus 去发布一个消息,消息的内 容是 LocationChangeEvent,所以 LocationChangeEvent 的接受者都能接收 到此发布的消息。注意的是,发布消息只能一个 Object 对象。

4. 消息的订阅

消息的订阅和发布之前都要在当前的类中进行 Bus 的注册。订阅是对消息发布 的补充,当消息发布的事件调用之后,对应的消息订阅者就能立即接收到此消息。实 现订阅功能是通过自定义方法实现的,方法的名称可以随意,同时还得需要满足三个条 件。

1、方法前使用@Subscribe 注解
2、访问修饰符为 public
3、单一参数,根据你想订阅的消息进行设置 注:使用之前,记得进行注册;使用完毕,记得释放。


5. 消息的 produce

当订阅者注册完毕,针对特定的消息,通常也需要获取当前已知的值。这个时候, 就 需要用到 produce。同样的使用 produce 的方法名称可以随意,同时有三点需要 注意。
1、方法前使用@produce 注解
2、访问修饰符为 public
3、无参,返回值是基于订阅者参数类型


Otto缺点

要实现上述订阅/发布模型的功能,付出的代价就 是对各个注册 Bus 的类进行反射。如果大量的使用的情况下,对应用的性能多 少有点副影响。

Otto原理

实现原理: 这个框架所实现的功能本质是在一个对象中调用任意的另一个或多个对象
中的方法, 而不需要将这个或者这些对象传入调用者.
如果把它们都传入调用者去调用它们的方法, 那么调用者就依赖这些对象, 程序 的耦合度就高了, 所以说这个框架是用来解耦的.
无论 EventBus 还是 Otto 都有一个注册(register)的方法, 方法参数是需要订阅 事件的对象.
register 方法会拿到参数的 class 文件,
Otto 通过反射获取类中有@Subscribe 注解的方法,
将该 Method 对象和参数放入 Otto 内部的一个集合中,
在发布事件时调用 post 方法, post 方法会根据参数类型, 在这个集合中找到 register 时放入的相对应 Method 对象,
调用这个 Method 所需要的对象是 register 时传入的参数, 所需的参数是 post时传入的参数, 这些都已经有了, 直接将它 invoke

EventBus 与Otto 区别

  • Otto 是通过注解来确定哪些方法是需要接收事件的方法,
  • EventBus 是通过固定的方法名来确定的, 所以在项目上线, 代码混淆时, 使用了 EventBus 的类都不能混淆, 因此在项目中使用 Otto 会更多一点.

从事件订阅的处理差别来看:

1、eventbus是采用反射的方式对整个注册的类的所有方法进行扫描来完成注册;

2、otto采用了注解的方式完成注册;

3、共同的地方缓存所有注册并有可用性的检测。同时可以移除注册;

4、注册的共同点都是采用method方法进行一个集成。


EventBus

EventBus 的主要实现机制还是基于反射,一句话概括就是:

  1. 注册时传入目标类对象,然后利用反射筛选出 @Subscribe 的方法,然后以相同的参数类型为 key,将不同的方法合并为 list作为 value,得到一个 map 集合;
  2. 当用户 post 数据时,再以数据类型为 key,从 map 中取出对应的方法 list,然后遍历 list,再利用反射机制对指定的方法执行 invoke 操作,完成调用;

https://www.jianshu.com/p/4883397870e6
https://www.jianshu.com/p/d9516884dbd4

相关文章

网友评论

    本文标题:Otto 与 EventBus

    本文链接:https://www.haomeiwen.com/subject/usjcahtx.html