适用于Android的EventBus vs RxJava

时间:2016-11-07 18:00:14

标签: android

我是RxJava的新手并计划将其集成到我的应用程序中。使用RxJava而不是EventBus有什么好处? EventBus将类与传统的回调分离,并通过EventBus进行通信。 EventBus还通过为Main或Worker线程上的Subscribe提供选项来提供线程处理功能。与EventBus相比,Rxjava还提供了哪些其他功能?

4 个答案:

答案 0 :(得分:3)

这两个是完全不同的主题/技术。

事件总线,只是一个JMS系统,使用发布者/订阅者模式作为ActiveMQ或tibco进行通信。

如果需要,RXJava是一个异步应用观察者模式的扩展。

正如您所看到的,两者都是针对不同需求的完全不同的解决方案。

您可以在Vertx工具中阅读一些实施EvemntBus http://vertx.io/docs/vertx-core/java/#event_bus

的优秀文档

对于RxJava,您可以在此项目中看到有关此库及其运算符如何工作的多个实际示例。 https://github.com/politrons/reactive

欢迎来到被动的世界!

答案 1 :(得分:2)

虽然我也是新手,但我还没有写过RxJAva中的任何代码,我会尽力向你解释。

它们之间的主要区别在于RxJava表示Java的Reactive Extensions,这意味着只能以反应方式编写Java代码,其中被动编程范式就像面向对象编程一样,它基于函数式编程。它将所有传入和传出的数据表示为事件流。

为了更清楚,请使用RxJava查看经典Hello World实现:

public static void hello(String... names) {
    Observable.from(names).subscribe(new Action1<String>() {

        @Override
        public void call(String s) {
            System.out.println("Hello " + s + "!");
        }

    });
}
     

来自:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava

根据其官方Github页面的定义:

  

JVM的Reactive Extensions - 用于组合异步的库   和使用Java VM的可观察序列的基于事件的程序。

     

它扩展了观察者模式以支持数据/事件序列   并添加允许您将序列组合在一起的运算符   在声明性地同时抽象出对诸如此类事物的关注   低级线程,同步,线程安全和并发   数据结构。

     

来自:https://github.com/ReactiveX/RxJava

因此,如果你想以反应的方式编写代码,建议学习对象,然后进行功能(有关Coursera的很好的入门课程或尝试学习Kotlin),最后选择被动。

EventBus只是一个小型库,用于简化活动,片段,线程,服务等之间的通信。它缺少RxJava提供的maaaany功能。此外,使用RxJava可以非常简单地创建事件总线,因此如果您在项目中使用RxJava,则会忘记EventBus或Otto库。

看看:http://blog.kaush.co/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/

所以它并不是你已经注意到选择一个或另一个库。如果你只需要在Activities之间提供事件,那么在大多数情况下你不会使用RxJava,因为它很重。

答案 2 :(得分:1)

当传递对受算法影响的部件的引用变得过于昂贵时,EventBus库应该用于组织Android组件或部分复杂算法之间的水平交互。不幸的是,它打破了包装,因为所有订阅方法都必须是公开的 RxJava库是由Netflix公司创建的,用于为Android带来反应式编程,它是“观察者”的概括。设计模式。其主要目的 - 将所有传入和传出数据表示为事件流。算法本身成为“管道”,映射传入和传出事件。 rxJava中的公共实体:Observable&lt;&gt;,Subject&lt;&gt ;, Subscription,Subscriber。
可观察的代表事件的来源,主题&lt;&gt;和所有派生类 - &#34; Vortex&#34;,它可以从常规代码接收一些对象并从Observable中发出。订户是数据的接收者,连接到一些Observable。订阅 - 是数据源(Observable&lt;&gt;)和这些数据的接收者(订阅者)之间的连接。当订阅处于活动状态时,数据可以从源流向接收者,当您在订阅时调用.unsubscribe()时,会断开源并接收。 RxJava的其余部分是一组操作员,用于组织从源到目的地的数据流 因此,这两个库有不同的用途。 值得注意的是,您可以使用.subscribeOn()和.observeOn()运算符使用rxJava库来组织后台执行(参见docs)

答案 3 :(得分:1)

根据我的经验,公交车在(Android)生命周期中表现不佳,即当没有人接收时发送事件,一旦相关组件被创建,事件早已不复存在。