RxJava 3的新增功能

2020年春季,发布了RxJava框架的新版本RxJava 3,让我们看看主要的变化是什么,如何从RxJava 2切换到新版本,以及是否值得进行迁移。



请注意,新版本中没有全局更改,但是已经出现了对Java 8的支持,并且该库的使用更加方便。







免责声明:本文基于GitHub的评论,此外,我们分享了移动开发人员对RxJava 3的印象,但我们并不假装进行详尽的研究-因为新版本是最近发布的,并且没有太多实际经验。如果您有任何补充,请在评论中写,我们将很乐意讨论)



RxJava 3中的主要更改



所以我们在RxJava 3中看到的是



  • Java基本版本现在增加到8 *;
  • 支持以下语言功能:


-流

-流收藏家

-可选

- CompletableFeature



*要使用Java8 API,你需要提高minSDK到版本24。



反过来,开发人员删除了对以下功能的支持:



  • java.time.Duration-产生很多重载,可以随时用time + unit替换;
  • java.util.function-无法引发异常,并且重载会产生不必要的“歧义”。


包的结构也发生了变化:







呈现的变化可以分为2组:



  1. 行为改变
  2. API变更


行为改变



  • 所有错误将得到处理


以前,RxJava 2的问题之一是在某些情况下,错误可能会丢失并且无法处理。现在,在RxJava 3中,取消订阅可能引发错误的源将触发该错误通过RxJavaPlugins.onError()引发到一般错误处理程序中







  • Connectable.reset()


RxJava 2中有一个温泉问题:当接收到ConnectableObservable终端事件时,新连接将忽略所有元素,而仅接收终止事件。



RxJava 3引入了一个使用reset()函数来重置ConnectableObservable状态的函数,以允许新连接的订户处理数据。











  • 能够暂停Flowable.publish


在RxJava 3中,在接收到一定数量的值之后,Flowable.publish被暂停,其余元素可供后续订阅者使用。







  • Processor.offer()空参数


如果您尝试调用PublishProcessor.offer(),BehaviourProcessor.offer()或MulticastProcessor.offer()并传递null,则将引发NullPointerException而不是将错误传递给onError处理程序,并触发终端状态。







  • CompositeException.getCause()


在RxJava 2的早期版本中,getCause()方法有时会占用大量内存,因此在每个异常上都调用initCause方法是不稳定的,并且并不总是抛出异常链。



在新版本中,此方法从内部进行了更改,现在通过简单的字符串格式生成了堆栈跟踪形式的错误链。











  • 更改了参数验证例外


如果参数无效,则某些运算符现在将抛出IllegalArgumentException而不是IndexOutOfBoundsException:



-跳过

-skipLast

-takeLast

-takeLastTimed



  • fromX的预关闭源


fromAction()和fromRunnable()库已与其余fromX()调用保持一致。现在,相应地被调用时,fromRunnable()和fromAction()回调将立即关闭。在RxJava 2中,在将传递给参数的lambda主体执行结束后,将关闭这些运算符。







  • 使用()时的资源清理顺序


using()语句具有一个参数,负责何时清除使用的资源(true-完成之前,false-之后)。在该库的早期版本中,此参数被忽略,并且总是在获得终端状态之前清除资源,但是在RxJava 3中,一切正常。







API变更



  • 新版本库的功能接口的异常处理已从Exception扩展到Throwable


  • 新型:供应商


在RxJava 3中,由于功能接口异常从Exception扩展到Throwable,因此引入了新的Supplier类型-类似Callable,但抛出Throwable







  • 在RxJava 3中,用于将一个数据源转换为另一个数据源的运算符已更改为特定的转换器










  • 移动的组件


由于RxJava3将支持Java8 API,因此出现了一种新的解决方案来替换各个工厂类:这些工厂的方法已成为Disposable接口本身的静态方法。



和以前一样:







现在:





  • 为了减少警告,在CompositeDisposable内部使用的DisposableContainer类已成为公共API的一部分
  • RxJava 2中的某些运算符处于试验阶段,在第三版中,它们成为标准运算符:


Flowable promotions



dematerialize(Function)



Observable promotions

dematerialize(Function)



Maybe promotions



doOnTerminate(Action)

materialize()



Single promotions



dematerialize(Function)

materialize()



Complectable promotions



delaySubscription(long, TimeUnit)

delaySubscription(long, TimeUnit, Scheduler)

materialize()







































  • fromX()-




















Flowable

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Observable

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Maybe

startWith(Publisher)

startWith(ObservableSource)

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Single

startWith(Publisher)

startWith(ObservableSource)

startWith(MaybeSource)

startWith(SingleSource)

startWith(ComplectableSource)



Complectable

startWith(MaybeSource)

startWith(SingleSource)































Java8





增加了新的运营商fromOptional()为可流动的,可观察并可能





增加新的运营商fromStream()可流动和可观测









增加了新的运营商fromCompletionStage()所有五个数据源类型









增加了新的运营商mapOptional()为可流动,可观察的,也许和单。它只允许传递非空值,为Flowable和Observable







添加了新的blockingStream()运算符。运算符将数据流表示为流,但建议在完成数据流后关闭该流,以防止发生各种泄漏。







添加了新的运算符flatMapStream()concatMapStream()用于Flowable和Observable-允许将每个项目转换为单独的流







添加了新的运算符flattenStreamAsFlowable()flattenStreamAsObservable()用于Maybe,以及等效的FlatMapStream()运算符用于Observable和Flowable







重命名了什么





API



Maybe.toSingle(),替换-Maybe.defaultIfEmpty()

订阅(...,...,...,),替换-doOnSubscribe()

Single.toCompletable(),替换-Single.ignoreElement()

Completable.blockingGet(),替换-Completable .blockingAwait()

重播(Scheduler),替换-observeOn(Scheduler)

取消实现(),替换- 反序列化(Function)

onExceptionResumeNext(),替换-onErrorResumeNext(Function)

CombineLatest()(带有vararg参数),替换-CombineLatestArray()

fromFuture()(与调度参数),更换- subscribeOn()

concatMapIterable()(用缓冲液参数),更换- concatMapIterable(功能)



还从TestSubscriber和TestObserver中删除了以下方法:







如何迁移



许多开发人员注意到,从RxJava 2迁移到RxJava 3是一个相当费力的过程。进行过渡有两种选择:



  • 在您的项目中同时拥有两个版本的库;
  • 执行完整迁移到RxJava 3,同时可以使用特殊的


那么如何迁移:



  • 要更新API的工作,请使用已更改的RxJava 2方法的类似物。
  • 重要的是要考虑到某些第三方库仍在“坐在” RxJava 2上。为了简化过渡,您可以使用RxJavaBridge,它将大多数迁移隐藏幕后
  • Retrofit RxJava3CallAdapterFactory .




我们已经回顾了RxJava 3中的新增功能。现在让我们尝试回答主要问题-完全值得迁移吗?



RxJava 3实际上是对API的改进。由于没有任何根本性的变化,因此通常不需要立即迁移到最新版本。过渡本身需要付出很多努力,尽管许多第三方库仍与RxJava 2关联在一起才能与Java8一起使用,但您还需要将minSDK提升到版本24。一些团队还提供其他解决方案,例如使用Kotlin Coroutines。



但是,值得注意的是,RxJava 2现在正进入“维护”模式,这意味着更新中将仅修复了错误。预计第二版支持将于2021年2月28日终止。



! , .



All Articles