【问题标题】:Differences between RxJava1 and RxJava2RxJava1 和 RxJava2 的区别
【发布时间】:2016-07-17 15:50:46
【问题描述】:

我一直在查看 RxJava1 https://github.com/ReactiveX/RxJava/releases 和 RxJava2 https://github.com/ReactiveX/RxJava/wiki/Reactive-Streams 的文档,似乎唯一不同的是 RxJava 2 具有 Java Stream。

还有什么不同的吗?

我一直在使用版本 1.1.3,但我不确定是否值得迁移到 RxJava2,因为我们已经在代码中使用 Java 8 流

问候。

【问题讨论】:

  • 我想说,唯一的区别在于它使用了 Java 8 中引入的新 Java Streams API
  • 您是否阅读过您提供的第二个链接? “RxJava 1.x 不直接实现 Reactive Streams API”“RxJava 2.x 将直接针对 Reactive Streams API”。这对我来说听起来有很大的不同:将其从不直接实现 API 更改为实际直接实现 API。
  • 是的,我读到了,但我只是想确定是否还有其他差异
  • 您对问题的最初假设是唯一的变化是它需要 Java 8+。在任何地方close 与更改 API 有何不同?你没有任何意义。你想要什么?所做的每项更改的详细列表?比较源代码就知道了。
  • 我不这么说,因为我不知道。我只是说区别远不止需要 Java 8。如果这不是您的问题,您应该修改您的问题以说出您的实际意思。

标签: java java-8 rx-java


【解决方案1】:

RxJava 1.x 和 2.x 都设计为 Java 6+,因此我们不能在任何版本中支持 Java 8 Streams。决定继续支持无数的 Android 设备和版本,这些设备和版本永远不会更新到与 Java 8 兼容的运行时。如果您需要 Java 8 支持,请考虑使用 Pivotal 的 Reactor-Core

两者之间的主要区别在于 2.x 直接针对 Reactive-Streams SPI,为此,它已完全从头开始重写。我们目前处于开发预览模式,您可以按照2.x branch readme 中的说明进行访问。

2.x 的完全重写大大改善了我们的内存消耗和性能; here is a benchmark 比较各种版本和库。

在 API 方面,我们计划继续支持 1.x 中存在的所有运算符,并可能在几年内用新的运算符扩展这两个版本,然后对 1.x 的支持结束。

由于 2.x 是一个新架构,许多依赖库(例如 Retrofit)也必须更新;这可能不会在今年 8 月底之前发生,或者可能需要几个月的时间才能赶上。 Here is the wiki page 包含差异的亮点。

【讨论】:

    【解决方案2】:

    正如我在my sample project - link中实现的RxJava2

    以下是RxJava2和RxJava1的区别:

    1. 为了允许 RxJava 1.x 和 RxJava 2.x 并排使用,RxJava 2.x 位于 maven 坐标 io.reactivex.rxjava2:rxjava:2.x.y 下,并且可以在 io.reactivex 下访问类。

    2. 从 1.x 切换到 2.x 的用户必须重新组织他们的导入,但要小心。

    3. onCompleted -> onComplete - 没有尾随 d

    4. CompositeSubscription -> CompositeDisposable - CompositeDisposable as CompositeSubscriptionSubscription 已被删除

    5. Func1 -> Function

    6. Func2 -> BiFunction

    7. limit 运算符已被删除 - 在 RxJava2 中使用 take

    RxJava 2.0 已经在 Reactive-Streams 规范之上完全重写。该规范本身已经从 RxJava 1.x 演变而来,并为响应式系统和库提供了一个通用基线。

    因为 Reactive-Streams 具有不同的架构,它要求对一些众所周知的 RxJava 类型进行更改。

    RxJava2 比 RxJava1 具有更好的性能低内存使用率

    [来源:https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0]

    【讨论】:

      【解决方案3】:

      主要区别之一适用于 .filter 运算符。如文档所述:

      此外,需要谓词的运算符不再使用Func1<T, Boolean>,而是具有单独的原始返回类型Predicate&lt;T&gt; (由于没有自动装箱,可以更好地进行内联)。

      所以对于.filter 运算符,您需要像下面的示例一样进行更改

              RxTextView.textChanges(editText)
                  .debounce(400, TimeUnit.MILLISECONDS)
                  .filter(new Predicate<CharSequence>() {
                      @Override
                      public boolean lengthOk(CharSequence charSequence) {
                          return charSequence.length() > 3;
                      }
                  })
                  .subscribeOn(Schedulers.io())
                  .observeOn(AndroidSchedulers.mainThread())
                  .subscribe(/* attach your observer */);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 2011-10-20
        相关资源
        最近更新 更多