我对android中的EventBus和RxJava之间的区别感到困惑。我需要为我的问题实现其中一个关于在完成一些更改后通知某些组件的问题,以便他们可以更新其状态。
另外,我读到EventsBus已经被RxJava弃用了,我不知道这些信息是否属实。
答案 0 :(得分:94)
EventBus
和RxJava
的性质不同。
EventBus
只是一个bus
顾名思义 - 它提供了订阅和发布事件到"总线"的机制,而无需关心如何完成布线,这是什么"巴士"实际上是等等。在Android环境中,EventBus
只是一种处理发送和接收Broadcast
消息的更简单的方法。
RxJava
比那更强大。是的,您可以订阅和发布事件,但您可以更好地控制流程 - 频率,线程发生的一切,等等。RxJava
的主要力量(在我看来)是您可以操纵数据使用它的一些operators
非常容易发布。
总结一下 - 如果您只关心发布一些事件并在收到时执行某些操作 - 您可能最好使用两者中最简单的一种,即某种Bus
,甚至普通的BroadcastReceiver
。如果您还可以转换数据,处理线程或简化错误处理,那么请使用RxJava
方法。请记住,RxJava
通常具有陡峭的学习曲线,因此需要一些时间来习惯其概念。
答案 1 :(得分:3)
要了解 RxJava ,请考虑一个列表。如今,可以使用功能方法(map,groupBy等)轻松完成诸如转换,拆分,合并之类的列表。 RxJava使用相同的原理,除了它的主要目标不是列表而是流。流是异步的,通常是实时数据,例如websocket频道或在线电影。
事件总线来自于解耦类的需求,而这些类在Android中通常与生命周期相关联。网络回调和Activity的View作为实例的紧密耦合,已成为众多空指针异常的原因。具有发布者-订阅者模式的事件总线可以缓解此问题。
如何与RxJava混合使用? 首先,RxJava合并了Observable模式。在这里,观察者观察一个可观察对象,并在事件到达时做出反应。 Observable具有几个子类,其中一个是Subject,它具有Observable和Observer的属性。由于它通过捕获事件并将其发布给订阅者而工作,因此从技术上讲,它充当事件总线。
使用RxJava作为事件总线是否明智?不会。RxJava会引入不必要的复杂性以达到更简单的目的。仅在应用程序确实处理流时才使用它。例如,将电影流中的帧与另一流中的字幕配对。如果应用仅使用REST API,并且需要将回调与活动/片段分离,那么事件总线就足够了。
答案 2 :(得分:0)
Live @Vesko写道,RxJava和事件总线的性质不同,可能有助于解决不同的问题。然而,在某些情况下,他们都可以解决同样的问题(虽然成本不同),这可能是许多人混淆这两个概念的原因。
RxJava的概念类似于不久前发布的Android LiveData,为了更好地理解这些概念,以及事件总线,我建议你阅读我的帖子。在这篇文章中,我回顾了这些概念,描述了我们应该使用一个在另一个上的场景以及使用一个而不是另一个的优点和缺点。我认为它可能对您有用:
答案 3 :(得分:0)
如果要从服务器获取数据并更新UI,请使用RxJava + Refrofit。如果更新UI或执行某些操作而不获取数据,则EventBus就足够了。