【问题标题】:Observable.concat with ExceptionObservable.concat 异常
【发布时间】:2018-03-14 15:16:47
【问题描述】:

我有 2 个数据源:数据库和服务器。当我启动应用程序时,我从存储库(MyRepository)中调用方法:

public Observable<List<MyObj>> fetchMyObjs() {
    Observable<List<MyObj>> localData = mLocalDataSource.fetchMyObjs();
    Observable<List<MyObj>> remoteData = mRemoteDataSource.fetchMyObjs();
    return Observable.concat(localData, remoteData);
}

我订阅如下:

mMyRepository.fetchMyObjs()         
            .compose(applySchedulers())
            .subscribe(
                    myObjs -> {
                        //do somthing
                    },
                    throwable ->  {
                        //handle error
                    }
            );

我希望从数据库中加载数据会更快,当网络数据下载完成后,我会简单地更新Activity中的数据。

连接互联网后,一切正常。但是当我们在没有连接到网络的情况下打开应用程序时,mRemoteDataSource.fetchMyObjs(); 会抛出 UnknownHostException 并且所有 Observable 都将结束(localData 的订阅者不起作用(尽管日志显示数据库中的数据已被获取)) .当我尝试从 MyRepository 类(通过 SwipeRefresh)再次调用 fetchMyObjs() 方法时,localData 的订阅者被触发。

我怎样才能摆脱这样的事实,即当网络关闭时,当应用程序启动时,订阅者是否为localData工作?

【问题讨论】:

    标签: java android rx-java rx-java2


    【解决方案1】:

    尝试一些错误处理运算符:

    https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators

    我猜 onErrorResumeNext() 会很好,但你必须自己测试它。也许这样的东西对你有用:

    Observable<List<MyObj>> remoteData = mRemoteDataSource.fetchMyObjs()
          .onErrorResumeNext()
    

    此外,我无法判断您的想法是否正确,但也许值得考虑重建此流程。忽略错误是不对的——这是肯定的;)

    【讨论】:

    • 不如尝试添加 doOnError 调用
    • 这似乎是正确的答案(前提是您接下来在简历中添加一些内容:.onErrorResumeNext(ignored -&gt; Observable.empty())。如果这不起作用,您能说出错误是什么@osip_000?
    【解决方案2】:

    您可以通过将observeOn(Scheduler scheduler, boolean delayError)delayError 设置为 true 来观察您的链。

    delayError - 指示 onError 通知是否不能提前于调度边界另一侧的 onNext 通知。如果为真,则以 onError 结尾的序列将以与从上游接收到的顺序相同的顺序重播

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2021-12-05
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多