【问题标题】:Get one result from 2 observables with RxJava使用 RxJava 从 2 个 observables 中获取一个结果
【发布时间】:2016-11-23 14:34:13
【问题描述】:

我是 RxJava 的新手,执行第一个“困难”查询时有些痛苦。

我有两个从 Retrofit 生成的 Observable,一个“ping”一个新的 api,另一个是旧的。第一个将查询'http://myurl.com/newapi/ping',第二个将查询'http://myurl.com/oldapi/ping'。这个请求的结果无关紧要,我只想知道服务器使用的是新的还是旧的api。

所以我想同时调用两个 observables,最后在最后有一个布尔值来知道我使用的是旧的还是新的 api。

我试过类似的东西

Observable.mergeDelayError(obsOldApi,obsNewApi)
            .observeOn(AndroidSchedulers.mainThread(), true)
            .subscribeOn(Schedulers.io())
            .subscribe(new Subscriber<String>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(String s) {
                }
            });

但是 onError 将被调用一次(我希望只有在两个请求都失败时才调用它)并且当 onNext 被调用时,我不知道它来自哪个请求(旧的还是新的 api?)。

感谢您的帮助

【问题讨论】:

  • 你可以使用onErrorResume,但这意味着只有在另一个失败时才调用一个api

标签: android rx-java retrofit2 rx-android


【解决方案1】:

为简单起见,假设您将收到 "NEW""OLD" 以了解哪些 api 可用。

您的操作的难点在于管理错误:RxJava 将错误作为终端状态处理。所以你必须忽略这个错误,例如使用.onErrorResumeNext()

   Observable<String> theOld = oldApi.map(r -> "OLD")
                                     // ignore errors
                                     .onErrorResumeNext(Obervable.empty());

   Observable<String> theNew = newApi.map(r -> "NEW")
                                     .onErrorResumeNext(Obervable.empty());


   Observable.merge(theOld, theNew)
             .first() // if both api are in errors
             .subscribe(api -> System.out.println("Available API : "+api));

我添加了运算符 first :它将只获取第一个结果("OLD""NEW"),但如果前一个 Observable 为空(如果两个 API 都不可用,则会出现这种情况)会触发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多