RxJava 2 を聞いたことはありますか? 最近リリースされたソフトです。使いやすくするためにRxJava 2は大幅に変更されました。そのほとんどの従属ライブラリは今アップグレードされていますので、コードベースで移行トリガーを実行しても大丈夫です。
ユーザたちにもっとこのソフトをわかりやすく使っていただくため、特にRx 1 を使用していた方々に、私は下記のガイドを作りました。
1.Understanding the changes(変更に対する理解)
2.Disposing subscriptions(サブスクリプションの廃棄)
3.Miscellaneous changes(その他の変更)
それでは始めましょう!
最初、Rx2の変更箇所を説明させていただきます。(Rx1使用者の視点から)
どうしてこの変更になりましたか?
tl;dr — Reactive Streams
Reactive Streamsは 「リアクティブ」プログラミングを行うための標準であり、RxJavaはバージョン2.xでReactive Streams仕様を実装しています。 RxJavaはリアクティブプログラミング言語の先駆者のような存在ですが、それは唯一のライブラリではありませんでした。反応的なパラダイムも扱っているものもありました。しかし、すべてのライブラリがReactive Streams仕様に準拠しているので、ライブラリ間のinterop(互換性)はあります。
仕様はかなりシンプルで、四つのインターフェースがあります:
1.Publisher (イベントを公開するため、例えば Observable、Flowable など- 後ほどはもっと詳しく説明します。)
2.Subscriber (Publisherから指令を受ける。)
3.Subscription (subscribe(Subscriber) => Subscription Publisher とSubscriber結合する際、そのコネクションはSubscriptionです)
4.Processor (Publisher + Subscriberです。, 馴染みはありますか? えー我々の課題に対して RxJava 1 luddites:合理化反対主義)
デザイン目標についてもう少し興味がある場合は、次のリソースもお勧めします。:
What’s different in 2.0 wiki ページです — 毎回分からないことがあると、私はいつもこのサイトを読みます。すごく参考になるページです。
Fragmented Ep #53 with JakeWharton (forgive the shameless promotion) — RxJava2について、なぜ・何が変更されたかを知りたいのならこれです。 実際のdemigod使って説明しますから、すごく分かりやすいです。私自身もこちらからヒントを得ました。
Thought process behind the 2.0 design
本当に忠実な人のためのサイトです。
Ep 11 of The Context — 私の友達 HannesさんとArtemさんが書いたサイトです。 🙂
そして一つ重要な変更を最初からクリアしましょう。
Dependency change(依存関係の変更)
サーチ(Search):
compile “io.reactivex:rxjava:${rxJavaVersion}”
compile “io.reactivex:rxandroid:${rxAndroidVersion}”
compile “com.jakewharton.rxbinding:rxbinding:${rxBindingsVersion}” compile “com.squareup.retrofit2:adapter-rxjava:${retrofit2Version}”
リプレース(Replace):
compile “io.reactivex.rxjava2:rxjava:${rxJavaVersion}”
compile “io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}”
compile “com.jakewharton.rxbinding2:rxbinding:${rxBindingsVersion}” compile “com.squareup.retrofit2:adapter-rxjava2:${retrofit2Version}”
A minor change in your gradle dependency pull (“2” suffix).
gradle dependency pull (“2” suffix)の微調整。
しかし、実際のクラスは内部的に新しいパッケージio.reactivex(vs rx)に移されています。したがって、これらのインポートステートメントを変更する必要があります。
理論的にはRx1とRx2を同時に実行することもできますが、Observablesのような特定の主要な構成要素はストリームを扱うという概念が非常に異なるため、これは悪い考えです。行動の違うことを覚えるのは本当に大変です(悪夢でしょう)。そしてもしRx1 と Rx2Observablesを一緒に使う時、一つ注意しなければならないことは、パッケージの名前で分類することです。(例:rx.Observable、 io.reactivex.Observable) これは混乱して間違ってしまうのは非常に簡単です。
一気にマイグレードしましょう。
もう一つ重要なポイントは:
Observable -> Flowable
Search : `import rx.Observable;` Replace: `import io.reactivex.Flowable;`
Flowableは新たなObservableです。簡単にいうとFlowableはバックプレッシャー対応可能(backpressure-enabled)なリアクティブクラスです。
これから、 ObservableではなくFlowableを使いたいです。こちらをデフォルトにしましょう。
もちろんObservables はまだ使えますけど、バックプレッシャーに本当に詳しくないと、恐らく使いたくないでしょ。
Flowable = Observable + backpressure handling
Flowable = Observable + backpressure 対応
またPublisherを覚えていますか? 基本的にそれはイベントを作るためのリアクティブストリームインターフェース(Reactive Streams interface)です。(もし分からないなら、前の段落をもう一度お読みください。)
そしてFlowable implements Publisherは新しいベースデフォルトリアクティブクラスです(base default reactive class )。Reactive Streams spec 1 <-> 1の実装もできます。 Flowable はprimero uno Publishe としてすればいいと思います。(これはまた、前のセクションで私がFlowableを新しいデフォルトとして推奨している理由の一部です)。
他のベースデフォルトリアクティブクラスはObservable、Single、Completable とMaybeです。でもこちらは直接Publisherインターフェースを実装できません。
なぜ聞きますか?
他の基本クラスは、Rxに特化した振る舞いを持つ “Rx”固有の構成要素とみなされています。これらは、Reactive Streams specsで見いだされる概念ではありません。
実際のinterface declarations を見ればわかると思います。Publisher がReactive Streams イベントプロデューサーとして、Subscriberは Reactive Streams イベントリスナーとして、下記interface code declarationを見れば、以前、話したことがきっとわかりやすくなります。(ここに一つのチップがあります:よく出るフレーズを覚えていきましょう。)
// Reactive Streams spec
// Flowable implements Publisher
interface Publisher<T> {
void subscribe(Subscriber<? super T> s);
}
Publisher と SubscriberはReactive Streams specの一部です。Flowableは新しいnumero unoベースリアクティブクラスです(choice- implements Publisherの一部です)。ついてこれますか?
そしたら他のベースリアクティブクラス(Observable や Singleなど)はどうなりますか?
パブリッシング側では、標準のパブリッシャインターフェイスを実装する代わりに、他のイベントプロデューサが「類似の」インターフェイスを実装します。
// RxJava specific constructs
// Observable implements “ObservableSource”
interface ObservableSource<T> {
void subscribe(Observer<? super T> observer);
// notice “Observer” here vs the standard “Subscriber”
}
// Single implements SingleSource
interface SingleSource<T> {
void subscribe(SingleObserver<? super T> observer);
}
interface CompletableSource {
void subscribe(CompletableObserver observer);
}
interface MaybeSource<T> {
void subscribe(MaybeObserver<? super T> observer);
}
注意:standard Subscriber (Reactive Streams standard)の代わりに他のベースリアクティブクラス(Observable、Singleなど)に対応する「特別な」Rx固有のSubscriberまたは「Observer」と呼ばれるイベントリスナーが追加されるようになりました。
ここまではセクション1でした。次はdisposing subscriptionsについて紹介していただきたいと思います。
タイトル:RxJava 1 -> RxJava 2 (Understanding the Changes)
作者:Kaushik Gopal
原文URL:https://tech.instacart.com/rxjava-1-rxjava-2-understanding-the-changes-5370c461bea