RXJava создает наблюдаемую при завершении других - PullRequest
0 голосов
/ 05 сентября 2018

Привет, я довольно долго боролся с этим. Любая помощь приветствуется.

У меня есть требование запустить одну наблюдаемую после завершения другой наблюдаемой. Так, например Следующий код создает наблюдаемое из входного значения в значение + 10.

 Observable<ColoredIntegerModel> getSequenceObservable(int value, int delay, int color) {
    return Observable.range(value,10)
            .map(i -> {
                Log.d(TAG, "Value " + i
                        + " evaluating on " + Thread.currentThread().getName()
                        + " emitting item at " + System.currentTimeMillis());
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException e) {

                }
                return new ColoredIntegerModel(i, color);
            });
}

ColorIntegerModel выглядит следующим образом

public class ColoredIntegerModel {

    private Integer mValue;
    private int mColor;

    public ColoredIntegerModel(Integer value, int color) {
        mValue = value;
        mColor = color;
    }

    public Integer getValue() {
        return mValue;
    }

    public int getColor() {
        return mColor;
    }
}

Я создаю две наблюдаемые следующим образом и объединяю их следующим образом.

Observable<ColoredIntegerModel> observable1 = getSequenceObservable(1, 1000, Color.BLUE);

Observable<ColoredIntegerModel> observable11 = getSequenceObservable(11, 1000, Color.RED);

 mDisposable =
            observable1.concatWith(observable11)
            .doOnDispose(() -> {Log.d(TAG, "observable disposed");})
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .repeat(2)
            .subscribe((m) -> {
                Utils.appendColoredText(mResultTextView, "Adding item "
                        + m.getValue().toString() + "\n", m.getColor());
            });

Приведенный выше код печатает 1..10 (синим цветом каждый элемент с задержкой на 1 с) и 11..20 (красным цветом).

Пока все хорошо.

Но мое требование - создать вторую наблюдаемую только после того, как первая будет завершена. Фактически это может быть массив наблюдаемых, где наблюдаемая n + 1 создается только после выполнения n-го. Каждая наблюдаемая может испускать несколько предметов. Есть ли оператор для этого?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете начать следующую наблюдаемую из doOnCompleted () предыдущей

Observable<MyData> observable1 = ...;
Observable<MyData> observable2 = ...;
Observable<MyData> observable3 = ...;

Observable
       .concat(observable1.doOnCompleted(this::onCompleteObservable1),
            observable2.doOnCompleted(this::onCompleteObservable2),
            observable3.doOnCompleted(this::onCompleteObservable3))
            ...
            ...

Надеюсь, эта помощь.

0 голосов
/ 05 сентября 2018

Не знаю, правильно ли я понял, но если вы хотите создать Observable, когда подписываетесь на него, вам нужен оператор defer

...