118
102

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RxJava2での変更点

Last updated at Posted at 2016-09-12

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非許容つらい・・

参考

118
102
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
118
102

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?