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/