【问题标题】:Waiting for couple of observable to finish with/without sequence Retrofit2 with rxjava - Android等待几个 observable 完成有/没有序列 Retrofit2 with rxjava - Android
【发布时间】:2016-06-14 21:56:45
【问题描述】:

我使用带有 rxjava 扩展的改造 2

我有 3 个 Observable,它们会做 3 种不同的事情

Observable<String> observable1 = RetrofitInterface.GetByID(id);
Observable<String> observable2 = RetrofitInterface.GetByKey(key);
Observable<String> observable3 = RetrofitInterface.GetByValue(value);

现在以某种方式用户可以选择一起运行所有这些

要运行它们,我这样做:

observable1.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .unsubscribeOn(Schedulers.io())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(String str1) {
                        // do some stuff here
                    }
                });

用户在这里有3个选项,

  1. 单独运行每个可观察对象
  2. 三个一起运行,等待它们完成显示结果
  3. 依次运行它们,并一一得到结果。

我们如何在 Rxjava 中执行最后两个选项,让 Retrofit 将这三个 observables 发送给我们?

【问题讨论】:

    标签: android rx-java retrofit2 rx-android


    【解决方案1】:

    您可以使用 zip 访问的第二个选项,如下所示:

    public class ExampleUnitTest {
        @Test
        public void testSample() throws Exception {
            Observable<String> observable1 = Observable.just("I");
            Observable<String> observable2 = Observable.just("Love");
            Observable<String> observable3 = Observable.just("RxJava");
    
            Observable.zip(observable1, observable2, observable3,
                    (s1, s2, s3) -> {
                        return String.format("%s %s %s", s1, s2, s3);
                    }
            ).subscribe(System.out::println);
        }
    }
    

    它将打印I Love RxJava。看看zip documentations

    你用 concat 实现的第二个,检查一下:

    public class ExampleUnitTest {
        @Test
        public void testSample() throws Exception {
            Observable<String> observable1 = Observable.just("I");
            Observable<String> observable2 = Observable.just("Love");
            Observable<String> observable3 = Observable.just("RxJava");
    
            Observable.concat(observable1, observable2, observable3)
                    .subscribe(System.out::println);
        }
    }
    

    它将打印:

    I
    Love
    RxJava
    

    也看看concat documentation

    最好的问候。

    【讨论】:

    • 在使用zip 时不要忘记处理错误,例如,如果一个可观察对象以 onError|onCompleted 终止,则其他可观察对象可能不会发出任何值。
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2018-10-06
    相关资源
    最近更新 更多