首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向可观测性添加条件(rx-java)

向可观测性添加条件(rx-java)
EN

Stack Overflow用户
提问于 2016-06-18 21:33:41
回答 3查看 1.4K关注 0票数 0

总的来说,我对Rx和反应性编程还是比较陌生的。

这是我目前的密码。它现在所做的是:

  1. 检查设备是否存在数据
  2. 如果有,拿来
  3. 如果不存在,请从服务器获取 可观测= Observable.concat( helper.loadFromDevice(params),helper.loadFromServer(params)) .takeFirst(pastPaper -> pastPaper != null);observable.subscribe(.)

我想要做的是:

  1. 检查设备是否存在数据
  2. 如果有,拿来
  3. 如果不存在,请检查internet连接是否活动。
  4. 如果internet连接是主动从服务器获取的

如何按照上述步骤添加互联网连接检查?(已经有了方法)。

任何帮助都是非常感谢的。谢谢

边问:我上面的代码可以改进吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-18 22:08:24

您可以使用switchOnError,以便如果loadFromServer调用失败,它将被忽略。为了正常起见,您可能会记录来自服务器的任何错误,作为警告:

代码语言:javascript
复制
Observable<PastPaper> observable = Observable.concat(
    helper.loadFromDevice(params),
    helper.loadFromServer(params)
          .doOnError(e -> log.warn(e.getMessage()))
          .switchOnError(e -> Observable.empty())
    .takeFirst(pastPaper -> pastPaper != null);

否则,如果您想使用您的internet连接活动可观察(一个Observable<Boolean> )使用flatMap

代码语言:javascript
复制
Observable<PastPaper> observable = Observable.concat(
    helper.loadFromDevice(params),
    internetAvailable
        .filter(x -> x)
        .flatMap(x -> helper.loadFromServer(params)))
    .takeFirst(pastPaper -> pastPaper != null);
票数 0
EN

Stack Overflow用户

发布于 2016-06-19 07:37:00

人工运行示例:从本地开始,如果本地为空,则切换到远程,如果网络不可用,则返回默认值

代码语言:javascript
复制
        Observable<Integer> local = Observable.fromCallable(() -> 1);
        Observable<Integer> remote = Observable.fromCallable(() -> 2);
        Observable<Boolean> hasInternet = Observable.fromCallable(() -> true);
        Integer noLocalNoInetVal = 42;

        Observable<Integer> localOrEmpty = local.filter(localVal -> localVal != null);
        Observable<Integer> remoteWithInet = hasInternet
                                               .filter(inetAvailable -> inetAvailable)
                                               .flatMap(__ -> remote);

        Observable<Integer> localOrRemote = localOrEmpty.switchIfEmpty(remoteWithInet)
                                                 .firstOrDefault(noLocalNoInetVal);
票数 0
EN

Stack Overflow用户

发布于 2016-06-19 18:47:31

我认为在您的例子中,使用switchIfEmpty是最简单的方式

代码语言:javascript
复制
    Observable<PastPaper> observable = Observable.just(helper.loadFromDevice(params))
                  .switchIfEmpty(Observable.just(helper.loadFromServer(params)))
                  .subscribe(....);

这里还有关于如何工作https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/combining/ObservableSwitch.java的其他示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37901839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档