RxJava:如何运行两个顺序调用:第二个依赖于第一个

时间:2017-02-03 04:06:17

标签: java rx-java observable

我需要创建一个observable,其中依次运行2个基于改造的调用块。我知道我可以在一个Observer调用中运行第二个改装调用,但它会非常混乱。我将Observable代码放在与调用者不同的类中,它返回一个Observable。我想将第一个调用的结果传递给第二个调用,然后在第二个调用完成后将一个Observable传递给调用类。 (我使用的是Java 7而不是8)

public class GetFollowing {

 public Observable< ArrayList<Media> >  init() {
    return Observable.create(
                    new Observable.OnSubscribe< ArrayList<Media> >() {
                        @Override
                        public void call(Subscriber<? super  ArrayList<Media> > subscriber) {

...

我还需要将一个不同的类型传递回调用类,而不是传递给第二个改装调用。我一直在阅读有关map flatMap和concat的内容,但我似乎无法弄清楚如何构建它们以供我在这里使用。

更新

我想出了这个,不确定它是否最优雅,或者它是否会起作用......但如果它确实有效,有没有办法将第一个可观察的结果传递给第二个?如果第一次观察失败,我将如何处理问题?

Observable< ArrayList<Media> > test;

         Observable.concat(

                Observable.create(
                        new Observable.OnSubscribe< ArrayList<User> >() {
                            @Override
                            public void call(Subscriber<? super  ArrayList<User> > subscriber) {

                            }
                        }
                ),
                 test = Observable.create(
                        new Observable.OnSubscribe< ArrayList<Media> >() {
                            @Override
                            public void call(Subscriber<? super  ArrayList<Media> > subscriber) {

                            }
                        }
                )

        );

        return test; 

1 个答案:

答案 0 :(得分:5)

如果要求可以改写如下:

  1. 您有两种方法可以执行,并且都返回Observable s。
  2. 第一个方法的Observable上发出的项目需要在第二个方法发生的时候输入。
  3. 第二种方法的输出是Observable,它基于对第一Observable项的一些计算。
  4. RxJava中现成的flatMap功能是您的解决方案。以下是一个帮助您的简单实现。

    public static void main(String[] args) {
        Observable<Integer> o1 = Observable.just(1, 2);
        Observable<String> result = o1.flatMap(result1 -> Observable.just("Value is: "+result1));
        result.subscribe(finalResult -> System.out.println("Final result: "+finalResult));
    }
    

    输出:

    Final result: Value is: 1
    Final result: Value is: 2
    

    另一方面,如果第二种方法没有返回Observable,但对发出的项执行某些操作,则可以使用map实现相同的操作。