Java
Android
RxJava
RxJava2

RxJava2での変更点

More than 1 year has passed since last update.


RxJava2での変更点

RxJava2.xのリリースが近いということで、What's different in 2.0を元に1.xとの主な変更点を解説しようと思います。

執筆時点でバージョンは2.0.0-RC2です。

バージョンアップで変更点あれば追記するかもしれません。


パッケージ名の変更

RxJava 2.xは、ReactiveStreamに準拠するため、インタフェース名などが大きく変更されています。(例: Subscription -> Disposable など)

そのため、別パッケージによる提供となっています。

1.x
2.x

Dependency notation
io.reactivex:rxjava:1.x.y
io.reactivex.rxjava2:rxjava:2.x.y

Java base package
rx
io.reactivex


Null非許容

onNext(null)NullPointerExceptionが発生するようになります。

Observable.just(null);

BehaviorSubject.createDefault<String>(null);
behaviorSubject.onNext(null);

APIのレスポンスボディが空という意味でnullを返している場合は、Completableを使うべきです。

状態としてNull許容のBehaviorSubjectを使用しているような場合は、代替手段がないので致命的かもしれません。


ObservableとFlowable

1.xまではBackpressureはObservableに実装されていましたが、BackpressureなしがObservable、ありがFlowableとインターフェースが変わります。

Observable.create<Int>(emitter -> emitter.onNext(1));

Flowable.create<Int>(emitter -> emitter.onNext(1), FlowableEmitter.BackpressureMode.LATEST);

Backpressureを今まで意識していなかった場合は問題なさそうですが、使用している場合は、Flowableに変更する必要があります。


Single

onSuccessonErrorのどちらかが一度だけ呼ばれます。onCompletedは呼ばれなくなります。


Completable

onCompleteonErrorのどちらかが一度だけ呼ばれます。


Maybe

SingleCompletableを合わせたようなものです。onSuccessonCompleteonErrorのいずれかが一度だけ呼ばれます。


SubjectとProcessor

ObservableFlowable同様に、BackpressureなしがSubject、ありがProcessorとなります。


関数型インタフェース

RxJavaで定義されていた各種関数型インターフェースがほとんど変更されます。

基本的にラムダを使用していればあまり影響はないはずです。

各種インターフェースメソッドにthrows Exceptionが付与されているため、無駄なtry-catchも減らせるでしょう。

1.x
2.x

Action0
Action

Action1
Consumer

Action2
BiConsumer

ActionN
Consumer<Object[]>

Func0
削除?

Func1
Function

Func2
BiFunction

Func3-9
Function3-9

FuncN
Function<Object[], R>

Func1<T, Boolean>
Predicate

以下のように、関数型インターフェースのメソッド名も微妙に異なっています。

Interface name
Method name

Action
run

Consumer
accept

Function
apply

Predicate
test

またScheduler周りの関数型インターフェースは、Runnableが使われるようです。


Subscriber

ReactiveStream準拠により、subscribe()まわりもインターフェースが変更されています。

subscribe(Observer)subscribe(Subscriber)を使用していた場合は、特に注意が必要です。

まず、Observable#subscribe(Observer)Flowable#subscribe(Subscriber)と別れました。

そして、どちらもvoidメソッドになっています。

これをdispose(1.xではunsubscribe)するには、ObserverSubscriber自体にその実装をし、外部からdisposeしなくてはなりません。

また、onCompletedからonCompleteonStartからonSubscribeに変更されています。

ラムダのsubscribe(onNext, onError, onComplete, onSubscribe)を使用している場合は、大きな影響はなさそうです。


Subscription

SubscriptionからDisposableに変更されています。

1.x
2.x

Subscription
Disposable

isUnsubscribed()
isDisposed()

unsubscribe()
dispose()

CompositeSubscription
CompositeDisposable


Scheduler

Schedulers.test()が削除されたので、new TestScheduler()を使うようにしなくてはなりません。

Schedulerを自作する際に、Workerが廃止されたようです。(よく忘れられるから?)

自作していないかぎりあまり影響はないでしょう。


Operatorの変更点

https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#1x-observable-to-2x-flowable

オーバーロードメソッドへの統合や、新規追加など、かなり変更点があります。


Operatorの自作

https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0

1.xに比べると10倍ほど作るのが難しいらしい。

Observable#liftで使われるObservableOperatorソース見た感じ、Upstream/Downstreamのつなぎを全部書かないといけないようです。

ObservableOperatorを実装したユーティリティ系クラスもなさそう。


まとめ


  • 移行は簡単じゃない

  • ラムダ使ってない場合は、まずラムダに置換してから移行

  • Operatorの移行が大変そう

  • 個人的にこういうライブラリ作ってたので、null非許容つらい・・


参考