我有一个要从本地数据库(如果有)或从远程服务器检索的对象列表。我正在使用RxJava Observables(用于数据库的SqlBrite和用于远程服务器的Retrofit)。
我的查询代码如下:
Observable<List<MyObject>> dbObservable = mDatabase
.createQuery(MyObject.TABLE_NAME,MyObject.SELECT_TYPE_A)
.mapToList(MyObject.LOCAL_MAPPER);
Observable<List<MyObject>> remoteObservable = mRetrofitService.getMyObjectApiService().getMyObjects();
return Observable.concat(dbObservable, remoteObservable)
.first(new Func1<List<MyObject>, Boolean>() {
@Override
public Boolean call(List<MyObject> myObjects) {
return !myObjects.isEmpty();
}
});
我看到第一个可观察到的正在运行,并且碰到了一个空列表的第一个方法,但是随后改进的可观察到的不运行,没有网络请求。如果我切换了可观察对象的顺序,或者只是返回了远程可观察对象,则它会按预期工作,它将命中远程服务器并返回对象列表。
为什么远程可观察对象在这种情况下无法运行?当我首先将可观察对象与db连接,然后将其进行改进时,不会调用订户的onNext,orError和onComplete方法。
谢谢!
Kaushik Gopal在他的RxJava-Android-Samples github项目中解决了这个问题。
他建议使用此技术:
getFreshNetworkData()
.publish(network ->
Observable.merge(network,
getCachedDiskData().takeUntil(network)))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<MyObject>() {
...
});
在您的情况下,可能看起来像这样:
remoteObservable
.publish(network ->
Observable.merge(network,
dbObservable.takeUntil(network)))
.first(myObjects -> !myObjects.isEmpty());
编辑:听起来您可能只需要这个:
dbObservable
.flatMap(localResult -> {
if (localResult.isEmpty()) {
return remoteObservable;
} else {
return Observable.just(localResult);
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句