RXJava完成后创建一个可观察的其他

时间:2018-09-05 20:37:05

标签: android rxjs rx-java

嗨,我已经为此苦苦挣扎了一段时间。任何帮助表示赞赏。

我要求在完成另一个可观察值之后再运行一个可观察值。所以例如以下代码创建从输入值到值+ 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(每个延迟1s的项目以蓝色显示)和11..20(红色)。

到目前为止,一切都很好。

但是我的要求是仅在第一个可观察到的对象之后创建第二个可观察的对象。实际上,它可以是可观察对象的数组,其中n + 1个可观察对象仅在第n次完成后创建。每个可观察对象可以发射多个项目。是否有运营商可以实现这一目标?

2 个答案:

答案 0 :(得分:1)

我不知道我是否理解正确,但是如果要在订阅时创建Observable,则需要defer运算符

答案 1 :(得分:0)

您可以从上一个的doOnCompleted()开始下一个可观察的

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

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

希望获得帮助。