如何在Subscription上创建方法返回值?

时间:2016-04-06 14:56:02

标签: android rx-java

我有一个小代码示例,它从api或数据库返回一些数据,具体取决于上面的一个包含任何数据。

现在我想根据网络状态添加另一个条件。我使用ReactiveNetwork库但我无法使其工作,这是我尝试过的:

  @Override public Observable<List<Tactic>> getTactics(boolean forceRefresh) {

    Observable<List<Tactic>> diskObservable =
        disk.get().getTactics().compose(RxDataUtils.applyLog(SourceType.DISK));

    Observable<List<Tactic>> apiObservable = api.get()
        .getTactics()
        .doOnNext(tactics -> disk.get().save(tactics))
        .compose(RxDataUtils.applyLog(SourceType.API));

    Subscription connectivityStatusSubscription = new ReactiveNetwork().observeConnectivity(context)
        .compose(RxUtils.applyStandardSchedulers())
        .subscribe(connectivityStatus -> {
          isNetworkAvailable = RxDataUtils.isConnected(connectivityStatus);
          Timber.v("ConnectivityChanged: " + isNetworkAvailable);
        });

    if (isNetworkAvailable) return forceRefresh ?
        apiObservable : Observable.concat(diskObservable, apiObservable).first(
        tactics -> (tactics != null && tactics.size() > 0));
    return diskObservable;
  }

它根本没有记录任何内容

1 个答案:

答案 0 :(得分:3)

您应该将状态流与其他人合并,而不是创建两个单独的订阅 - 否则它不会对网络连接做出真正的反应。

您可能想要使用的是switchMap。每次网络连接发生变化时,都可以更新您正在使用的流。

总的来说,它是这样的:

connectivityObservable.switchMap(isConnected -> {
  if (isConnected) {
    return networkObservable;
  }
  return diskObservable;
}

(看起来你的情况会有点复杂,我只想在这里列出一般的想法。)