我正在寻找一种更好的方法,在使用RxJava时实现一个简单的Observable回退系统来处理空结果。我的想法是,如果一个本地查询返回了零项数据,那么应该执行一个备用查询(可以是网络调用或其他内容)。目前,我的代码如下:
Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
List<Object> results = queryLocalDatabase();
if (results.isEmpty()) {
subscriber.onError(new Throwable("Empty results"));
} else {
// Process results...
}
}
}).onErrorResumeNext(/* Fallback Observable goes here */);
虽然这样做可以达到效果,但是对于一个空的结果集抛出异常并不是很合理。我注意到有一些条件操作符可用,例如isEmpty
,但它似乎不能满足我的需求。例如,使用isEmpty
...
localObservable = Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(Subscriber<? super Object> subscriber) {
List<Object> results = queryLocalDatabase();
for (Object obj : results) {
// Process object
subscriber.onNext(object);
}
subscriber.onCompleted();
}
});
localObservable.isEmpty()
.switchMap(new Func1<Boolean, Observable<? extends Object>>() {
@Override
public Observable<? extends Object> call(Boolean isEmpty) {
if (isEmpty) {
// Return fallback Observable.
return fallbackObservable;
}
// Return original Observable, which would mean running the local query again... Not desired.
return localObservable;
}
});
这几乎把我带到了我想去的地方,但如果有非空项,localObservable
将似乎运行两次,这是无法接受的。