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

今すぐシェアしよう!
今すぐシェアしよう!