我有一个小代码示例,它从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;
}
它根本没有记录任何内容
答案 0 :(得分:3)
您应该将状态流与其他人合并,而不是创建两个单独的订阅 - 否则它不会对网络连接做出真正的反应。
您可能想要使用的是switchMap
。每次网络连接发生变化时,都可以更新您正在使用的流。
总的来说,它是这样的:
connectivityObservable.switchMap(isConnected -> {
if (isConnected) {
return networkObservable;
}
return diskObservable;
}
(看起来你的情况会有点复杂,我只想在这里列出一般的想法。)