如何以RxJava方式实现多步向导?

时间:2014-11-18 10:04:12

标签: rx-java

我试图在RxJava中实现一些多步骤使用向导。为了简化这种情况,我们假设用户只能进入下一步而不是后退。

我正在考虑将每个步骤建模为一个observable,它将在订阅时呈现自己,并在用户选择转到下一步时自行完成。所以会有step1_Observable,step2_Observable等。

然后向导控制器的逻辑就像 1)订阅step1_Observable 2)当step1_Observable完成时,订阅step2_Observable 3)当step2_Observable完成时,订阅step3_Observable 等等。

有人可能会想到为什么我不能只将下一步按钮点击事件建模为可观察对象并订阅它以呈现下一步。原因是,在我的设计中,每个步骤都有自己独特的方法供用户导航到下一页。例如,它可能是触摸屏上的特定手势,甚至可以正确回答测验。

我无法想象如何通过Rx提供的操作实现这一目标。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

flatMap用于按顺序运行Observable。下面是一个示例,说明在Observable完成后如何运行Observable:

public Observable<String> step1() {
    return null;
}

public Observable<String> step2() {
    return null;
}

public Observable<String> step3() {
    return null;
}

public Observable<String> chainSteps(final Observable<String> first, final Observable<String> second) {
    return first.flatMap(new Func1<String, Observable<String>>() {

        @Override
        public Observable<String> call(String s) {
            return Observable.empty();
        }
    }, new Func1<Throwable, Observable<String>>() {

        @Override
        public Observable<String> call(Throwable e) {
            return Observable.error(e);
        }
    }, new Func0<Observable<String>>() {

        @Override
        public Observable<String> call() {
            return second;
        }
    });
}

public void example() {
    chainSteps(chainSteps(step1(), step2()), step3()).subscribe(...);
}

您还可以使用Transformer使代码更具可重用性。

public class ChainTransformer<T> implements Observable.Transformer<T, T> {

    private final Observable<T> other;

    public ChainTransformer(Observable<T> other) {
        this.other = other;
    }

    @Override
    public Observable<? extends T> call(Observable<? extends T> observable) {
        return observable.flatMap(new Func1<T, Observable<T>>() {

            @Override
            public Observable<T> call(T s) {
                return Observable.empty();
            }
        }, new Func1<Throwable, Observable<T>>() {

            @Override
            public Observable<T> call(Throwable e) {
                return Observable.error(e);
            }
        }, new Func0<Observable<T>>() {

            @Override
            public Observable<T> call() {
                return other;
            }
        });
    }
}

public void example() {
    step1().compose(new ChainTransformer<String>(step2()))
            .compose(new ChainTransformer<String>(step3()));
}