EventBus和RxJava有什么区别?

58

我对于EventBus和RxJava在Android中的区别感到困惑。我需要实现其中一个来解决当一些变化发生时,通知一些组件以便它们可以更新状态的问题。
此外,我听说EventBus已经被RxJava取代,但我不知道这个信息是否正确。


2
据我所知,它们的用途略有不同,但基本上,RxJava可以做比EventBus更多的事情。 - OneCricketeer
6
Otto已经不再推荐使用,但GreenRobot仍然可用。http://greenrobot.org/eventbus/ - Kuffs
我投票支持重新打开这个问题,因为链接的重复问题没有像这里的答案一样有价值(那里只有一个回答涉及RxJava)。 - Daniel F
@DanielF,你也将另一个问题标记为重复了吗? - Tiago Martins Peres
1
@TiagoMartinsPeres - 不,我没有。如果这个问题重新开放,我会的。 - Daniel F
4个回答

109

EventBusRxJava 本质不同。

EventBus 就像其名字所示的那样,只是一个“bus”——它提供了一种机制来订阅和发布事件到“bus”,而无需关心连接方式、这个“bus”实际上是什么等等。在 Android 上下文中,EventBus 是更简单的处理发送和接收广播消息的方法,避免了冗长的模板代码。

另一方面,RxJava 要比前者强大得多。是的,你可以订阅和发布事件,但是你对整个过程有更多的控制力——包括频率、执行线程等等。我认为 RxJava 最强大的部分是,你可以很容易地使用它的成吨的操作符来操纵正在发布的数据。

总之——如果你只关心发布某些事件并在接收时执行某些操作,你可能最好使用其中最简单的一种,即一些类型的Bus,甚至是普通的BroadcastReceiver。如果你还需要转换数据、处理线程或简化错误处理,则可以选择RxJava的方法。请记住,RxJava 通常具有陡峭的学习曲线,因此需要一些时间来适应其概念。


谢谢你的回答。使用EventBus有什么缺点吗?与RxJava相比,它是否存在限制? - HiddenDroid
2
@HiddenDroid 是的,你可以直接使用 EventBus,但在我看来,RxJava 的操作符更加强大。RxJava 正在变得越来越流行(实际上不仅仅是 RxJava,响应式编程也是如此),你会发现许多库都将其包含在其 API 中(例如 Retrofit)。顺便说一句,一旦你习惯了使用它,它真的非常方便。 - mewa
3
@HiddenDroid说:“我想不出任何EventBus的具体缺点 - 这总归取决于你的任务是什么。就像我在回答中提到的 - 如果你只需要发送一些/响应一些事件 - 总线将完美地完成工作。如果你的任务比那更复杂 - 或许值得探索其他解决方案。诀窍在于找到适合任务的正确工具,所以如果你只需要1-2个BroadcastReceivers,就没必要使用RxJava了...” - Vesko
@Vesko 非常感谢您的答复。我可以理解从您那里得知,当任务更为复杂时,不建议使用EventBus。我真正想了解的是,EventBus架构中的负面因素是什么,以致于它无法处理复杂任务? - HiddenDroid
1
@HiddenDroid,不是说EventBus不被推荐使用 - 这完全取决于手头的任务。将两者进行比较就像是在比较橙子和苹果 - 它们有不同的用途。RxJava 的强大之处在于它的操作符 - 在这里查看:http://reactivex.io/documentation/operators.html。正如您所看到的,您可以轻松地进行转换、过滤、链式处理、缓存、错误处理以及许多其他操作。 - Vesko

5
要理解RxJava,可以想象一下列表。今天,使用功能方法(map、groupBy等)可以轻松地操作列表,比如转换、拆分、合并等。RxJava使用相同的原则,只不过它的主要目标不是列表,而是流。流是异步的,通常是实时数据,比如websocket频道或在线电影。 事件总线源于需要解耦Android中常常与生命周期绑定的类。网络回调和Activity的视图之间的紧密耦合关系是众多空指针异常的原因。事件总线通过发布者-订阅者模式缓解了这个问题。
它如何与RxJava混合使用?首先,RxJava整合了Observable模式。在这里,观察者观察可观察对象,并在事件到达时做出反应。可观察对象有几个子类,其中之一是主题,它具有Observable和Observer的属性。由于它通过捕获事件并将其发布给订阅者来工作,因此从技术上讲,它起到了事件总线的作用。
把RxJava用作事件总线明智吗?不是的,对于简单的目的,RxJava会引入不必要的复杂性。仅当应用程序确实操作流时才使用它。例如,将来自电影流的帧与来自另一个流的字幕配对。如果应用程序仅消耗REST API,并需要将回调与活动/片段解耦,则事件总线就足够了。

0

如果你想从服务器获取数据并更新UI,请使用RxJava + Refrofit。如果只是更新UI或执行一些操作而不需要获取数据,则EventBus就足够了。


0

Live @Vesko 写道,RxJava 和事件总线在本质上有所不同,可以用于解决不同的问题。然而,在某些情况下,它们都可以解决相同的问题(尽管成本不同),这可能是为什么许多人混淆这两个概念的原因。

RxJava 在概念上类似于 Android LiveData,后者不久前发布,为了更好地理解这些概念以及事件总线,我建议您阅读我的文章。在文章中,我介绍了应该在哪些情况下使用其中之一以及使用其中一个而不是另一个的利弊。我认为这可能对您有用:

何时以及为什么使用LiveData


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接