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-多くのオーバーロードを生成し、常に時間+単位で置き換えることができます。
  • java.util.function-例外をスローできず、オーバーロードにより不要な「あいまいさ」が生じる可能性があります。


パッケージ構造も変更されました:







表示される変更は2つのグループに分けることができます:



  1. 行動の変化
  2. APIの変更


行動の変化



  • すべてのエラーが処理されます


以前は、RxJava 2の問題の1つは、場合によってはエラーが失われ、処理できないことがありました。RxJava 3では、エラーをスローする可能性のあるソースから登録解除すると、RxJavaPlugins.onError()を介してこのエラーが一般エラーハンドラーにスローされます。







  • Connectable.reset()


RxJava 2に温泉の問題がありました。ConnectableObservableターミナルイベントを受信すると、新しい接続はすべてのアイテムを無視し、終了イベントのみを受信しました。



RxJava 3には、reset()関数を使用してConnectableObservable状態をリセットし、新しく接続されたサブスクライバーがデータを処理できるようにする関数が導入されています。











  • Flowable.publishを一時停止する機能


RxJava 3では、特定の数の値が受信された後、Flowable.publishが一時停止され、残りの要素は後続のサブスクライバーが使用できます。







  • Processor.offer()nullパラメータ


PublishProcessor.offer()、BehaviourProcessor.offer()、またはMulticastProcessor.offer()を呼び出してnullを渡そうとすると、onErrorハンドラーにエラーを渡す代わりにNullPointerExceptionがスローされ、最終状態がトリガーされます。







  • CompositeException.getCause()


RxJava 2の以前のバージョンでは、getCause()メソッドはかなりのメモリ負荷であり、各例外でinitCauseメソッドを呼び出すことが不安定で、常に例外チェーンをスローしませんでした。



新しいバージョンでは、このメソッドは内部から変更され、文字列の単純なフォーマットにより、スタックトレースの形式で一連のエラーを生成します。











  • 変更されたパラメーター検証例外


パラメーターが無効な場合、一部のオペレーターはIndexOutOfBoundsExceptionではなくIllegalArgumentExceptionをスロー



するようになりました

。- スキップ- スキップラスト

-テイクラスト

-テイクラストタイムド



  • fromXの事前クローズソース()


fromAction()およびfromRunnable()ライブラリは、残りのfromX()呼び出しと整合性が取れています。fromRunnable()およびfromAction()コールバックは、適宜呼び出されるとすぐに閉じられるようになりました。RxJava 2では、これらの演算子は、パラメーターに渡されたラムダの本体の実行の終了後に閉じられました。







  • ()を使用してリソースをクリーンアップする順序


using()ステートメントには、使用されたリソースをいつクリーンアップするかを担当するパラメーターがあります(true-完了前、false-後)。ライブラリの初期バージョンでは、このパラメーターは無視され、リソースは常に最終状態になる前にクリーンアップされていましたが、RxJava 3ではすべてが正しく機能していました。







APIの変更



  • 新しいバージョンのライブラリの機能インターフェイスの例外処理が、例外からスロー可能に拡張されました


  • 新しいタイプ:サプライヤー


RxJava 3では、機能インターフェースの例外がExceptionからThrowableに拡張されたため、新しいサプライヤータイプが導入されました。Callableに類似していますが、throws Throwable







  • RxJava 3では、あるデータソースを別のデータソースに変換するための演算子が特定のコンバーターに変更されました










  • 移動したコンポーネント


RxJava3がJava8 APIをサポートするという事実により、個々のファクトリクラスを置き換える新しいソリューションが登場しました。これらのファクトリのメソッドは、Disposableインターフェース自体の静的メソッドになりました。



以前と同じように:







今:





  • 警告を減らすために、CompositeDisposable内で使用されたDisposableContainerクラスは、パブリックAPIの一部になります
  • RxJava 2の一部の演算子は実験段階にあり、3番目のバージョンでは標準演算子になりました。


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





new演算子を追加しましたfromOptional()観測可能フロアブル、および多分用





を追加しましたnew演算子FROMSTREAM()フロアブルと観測可能なため









追加new演算子fromCompletionStageを()すべての5つのデータ・ソース・タイプのため









の新しい演算子を追加しました)mapOptional(たぶんフロアブル、観察可能な、およびシングルのために。空でない値のみを渡すことができるFlowableおよびObservableの







新しいblockingStream()演算子が追加されました。演算子はデータストリームをストリームとして表しますが、すべての種類のリークを防ぐために、作業の完了時にストリームを閉じることをお勧めします。







新しい演算子flatMapStream()FlowableおよびObservableのconcatMapStream() -各項目を個別のストリームに変換できるようにするMaybeの







新しい演算子flattenStreamAsFlowable()およびflattenStreamAsObservable()と、ObservableおよびFlowableの同等のflatMapStream()演算子を追加







名前が変更されたもの





API



Maybe.toSingle()、replacement- Maybe.defaultIfEmpty()

subscribe(...、...、...、)、replacement- doOnSubscribe()

Single.toCompletable()、replacement- Single.ignoreElement()

Completable.blockingGet()、replacement- Completable .blockingAwait()

、(スケジューラ)リプレイ置き換える- observeOn(スケジューラ)

マテリアライゼーション解除()、置き換える- デシリアライズ(機能)

)(onExceptionResumeNext、交換してください- onErrorResumeNext(機能)

(可変引数パラメータ付き)combineLatest()は、交換してください- combineLatestArrayを()

fromFuture()(スケジューラのパラメータを有する)、置換- subscribeOn()

concatMapIterable()(バッファ・パラメータを有する)、置換- concatMapIterable(機能)



また、TestSubscriberとTestObserverから次のメソッドを削除しました。







移行する方法



多くの開発者は、RxJava 2からRxJava 3への移行はかなり面倒なプロセスであると指摘しています。移行を行うには2つのオプションがあります。



  • プロジェクトに両方のバージョンのライブラリがあること。
  • RxJava 3への完全な移行を実行しながら、特別なライブラリを使用できます


移行する方法:



  • APIで作業を更新するには-変更される可能性のあるRxJava 2メソッドの類似体を使用します。
  • 一部のサードパーティライブラリはまだRxJava 2に「座っている」ことを覚えておくことが重要です。移行を簡単にするために、RxJavaBridgeを使用できます。これにより、ほとんどの移行内部で隠されます。
  • Retrofit RxJava3CallAdapterFactory .




RxJava 3の新機能を確認しました。次に、主な質問に答えてみましょう。移行する価値はありますか?



RxJava 3は実質的にAPIの改善です。根本的な変更はなかったため、通常は現在最新バージョンに移行する必要はありません。移行自体には労力が必要ですが、多くのサードパーティライブラリがまだRxJava 2に関連付けられており、Java8で動作するようにするには、minSDKをバージョン24に上げる必要があります。一部のチームは、Kotlinコルーチンの使用などの代替ソリューションも提供しています。



ただし、RxJava 2が「メンテナンス」モードになったことは注目に値します。つまり、更新によるバグ修正のみが行われます。 2番目のバージョンのサポートは、2021年2月28日に終了する予定です。



! , .



All Articles