【问题标题】:How do you chain multiple observables?你如何链接多个可观察对象?
【发布时间】:2015-11-11 00:51:42
【问题描述】:

假设我想显示服务器上的一些用户数据。我会搜索服务器,将其缓存,然后将其呈现给用户。 所以我最初的 RxJava 代码看起来像这样:

 ApiClient.getUser(userId), //An Observable that will spit out a UserResponse
    .subscribeOn(Schedulers.io()) //for the API observable (Do i need this?)
    .flatMap(new Func1<UserResponse, Observable<DatabasePutResult>>() {
          @Override
           public Observable<DatabasePutResult> call(UserResponse response) {
                return Database.cacheUser(response);
             }
          })
    .subscribeOn(Schedulers.io()) //for the database observable
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(//handle DatabasePutResult object in onNext());

现在,我有两个问题。

  1. 这是链接两个 Observable 的正确方法吗?如果没有,我应该怎么做?
  2. 如果我想为 Api Observable 处理 onError,我能否在维护链的同时以某种方式做到这一点?如果没有,最好的方法是什么?我真的需要将链分成两组 RxJava 调用吗?

【问题讨论】:

    标签: java android rx-java rx-android


    【解决方案1】:
    1. 你不需要这个:

    .subscribeOn(Schedulers.io()) //for the API observable (Do i need this?)

    如果你有兴趣,可以通过以下代码查看当前线程的 id:

    Thread.currentThread().getId();
    其他一切都很好。

    1. 你应该看看这个:Error-Handling-Operators。在这种情况下,我建议仔细查看onErrorResumeNext( )

    希望对您有所帮助。

    【讨论】:

    • 所以如果我理解这一点,如果我想尝试类似但不同的可观察对象(发出相同输出的不同可观察对象),我应该使用onErrorResumeNext(),但如果我想处理那个可观察对象错误我可以在onError() 里面通过检查if(e instanceof SomeException) 进行订阅
    • 如果您有两个发出相同异常的可观察对象怎么办。例如,如果我有一个网络调用并基于该结果,我会进行另一个网络调用。两者都可以发出 HttpException。你不能真正使用if(e instanceof SomeException)。你会在那个情景中提出什么建议?
    • @Sree ApiClient.getUser(userId) 如果我正确理解了您的代码 sn-p(您使用 Retrofit,对吗?),它将只发出一个 onNext 事件或一个 onError 事件。
    • 是的,但我只是以它为例。如果我这样做会发生什么ApiClient.getUser(userid).flatmap(//some other api call)
    • 这一切都取决于你需要的逻辑,如果你真的需要,你可以这样写ApiClient.getUser(userid).onErrorResumeNext(...).flatMap( v-&gt; ApiClient.newCall(o.value).retry((count, throwable) -&gt; throwable instanceof MyException || count &lt; 10)).subscribe(...):)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2015-01-12
    • 2011-06-17
    • 2021-01-03
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多