4
3

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のtoListで値が流れてこないときに確認すること

Posted at

この記事について

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が呼ばれずにいつまでも値が流れ続けるものに関しては、いつリストへの追加を打ち切るべきかがわからないので、集計結果を流すことができないのだと考えられます。

参考

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?