8
8

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.

既存コードをRxJava対応する際に気をつけるべきこと

Last updated at Posted at 2016-05-04

Grokking RxJava, Part 4: Reactive Androidを読んでいたら、前にこういう誤った実装をしていたところがあったので書いてみました。

Old, Slow Code

RxJavaにサポートしていないライブラリや、Observableを返したい既存コードがあった場合にどのように対応しますか?大体の場合は、既存の古いコードをそのままに、新規コードから古いコードを呼び出すようにするかと思います。

下記の例のように、殆どの場合はObservable.just()またはObservable.from()Observableを作るだけで十分です。

private Object oldMethod() { ... }

public Observable<Object> newMethod() {
    return Observable.just(oldMethod());
}

ですが、このoldMethodの処理が軽いものであれば問題なく動きますが、とても重たい時間のかかる処理だったらどうでしょうか?その場合に問題が発生します。なぜならObservable.just()を通る前に、oldMethod()を呼び出すためスレッドをブロックしてしまうからです。

この問題を回避するには、重たい処理をdefer()でラップして返すようにしてください。

private Object slowBlockingMethod() { ... }

public Observable<Object> newMethod() {
    return Observable.defer(() -> Observable.just(slowBlockingMethod()));
}

これで、slowBlockingMethod()はsubscribeされるまで呼ばれず、Observableが返されます。

参考

Grokking RxJava, Part 4: Reactive Android
http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/

8
8
0

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
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?