RxJava Observable toList operatorメモ

以下のようなonNext()を呼ばないパターンのあるObservableでtoList operatorを使った時のメモです。

    Observable listObservable = Observable.create(new Observable.OnSubscribe<Object>() {
      @Override public void call(Subscriber<? super Object> subscriber) {
        // Point1 : create object list.
        // Point2 : call onNext() in a foreach block.
        subscriber.onCompleted();
      }
    }).toList()
    .subscribe(new Observer<List<Object>>() {
      @Override public void onCompleted() {

      }

      @Override public void onError(Throwable e) {

      }

      @Override public void onNext(List<Object> objects) {
        // Question : objects.size()は?
      }
    });

foreachが実行されてsubscriber.onNext()が呼ばれる場合はQuestionの部分のobjects.size()は0より大きな値が返ってきます。
subscriber.onNext()が呼ばれない場合でもQuestionの部分のobjects.size()=0で返ってきます。

RxAndroidで勘違いしていたこと

Observable.subscribe()したら必ずsubscribe()の戻り値であるSubscriptionのunsubscribe()を呼ばなければいけない

そう思っていた時期が僕にもありました。
Subscriptionのleakが起きるのはonCompletedが呼ばれないObservableをsubscribe()したままにしてしまう場合です。以下のコード例はonCompletedが呼ばれてunsubscribeされるので明示的に呼び出す必要はありません。
ただし、Activityのライフサイクルより処理が長くなる場合は不要な処理となるのでCompositeSubscription等を使ってonPause()で明示的にunsubscribe()してあげましょう。

Observable.just(...).subscribe(...);
Observable.from(...).subscribe(...);
Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        subscriber.onNext(new Object());
        subscriber.onCompleted();
    }
}).subscribe(...);
Observable.create(new Observable.OnSubscribe<Object>() {
    @Override
    public void call(Subscriber<? super Object> subscriber) {
        subscriber.onError(new IllegalStateException());
    }
}).subscribe(...);

参考

Top 7 Tips for RxJava on Android