この記事について
RxJavaのObservable#toList()で値が流れてこなくて困ったので、メモとして残しておきます。
結論
toListを呼ぶObservableでonCompleteが呼ばれているかを確認する。
具体例
以下のように、onCompleteが呼ばれないObservableに対して、toListを使っても何も流れてきません。
Observable.create(subscriber -> {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
})
.toList()
.subscribe(integerList -> {
// 何も流れてこない!
})
この場合は、以下のようにSubscriber#onComplete()を呼ぶ必要があります。
Observable.create(subscriber -> {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onComplete();
})
.toList()
.subscribe(integerList -> {
// 1, 2, 3 の入ったリストが流れてくる
})
解説
Observable#toList()の説明 には以下の注意書きが記されています。
Be careful not to use this operator on Observables that emit infinite or very large numbers of items, as you do not have the option to unsubscribe.
toListは、無限に値を流し続けるObservableや非常に多くの値を流すObservableに対しては使用してはいけないと書いてあります。
toListは集計を行うメソッドなので、onCompleteが呼ばれずにいつまでも値が流れ続けるものに関しては、いつリストへの追加を打ち切るべきかがわからないので、集計結果を流すことができないのだと考えられます。
参考