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

Mik*_*679 3 java observable rx-java

我需要创建一个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) {

...
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

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; 
Run Code Online (Sandbox Code Playgroud)

Pav*_*mar 5

如果要求可以改写如下:

  1. 您有两种方法可以执行并且都返回Observables.
  2. 第一种方法发出的项目Observable需要在它们发生时被送入第二种方法.
  3. 第二种方法的输出Observable是基于对第一项的一些计算Observable.

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));
}
Run Code Online (Sandbox Code Playgroud)

输出:

Final result: Value is: 1
Final result: Value is: 2
Run Code Online (Sandbox Code Playgroud)

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