gpt4 book ai didi

rx-java - RxJava 的后备 Observable

转载 作者:行者123 更新时间:2023-12-02 05:57:27 25 4
gpt4 key购买 nike

我正在寻找一种更好的方法来实现使用 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 似乎会运行两次,这是一个交易破坏者。

最佳答案

使用 switchIfEmpty 运算符。

有使用示例:

Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
// return no item
//subscriber.onNext(...);
System.out.println("Generating nothing :)");
subscriber.onCompleted();
}
}).switchIfEmpty(Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
System.out.println("Generating item");
subscriber.onNext("item");
subscriber.onCompleted();
}
})).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}

@Override
public void onError(Throwable e) {
System.out.println("onError");
}

@Override
public void onNext(String s) {
System.out.println("onNext: " + s);
}
});

使用 lamda 进行简化:

Observable.create(subscriber -> {
// return no item
//subscriber.onNext(...);
System.out.println("Generating nothing :)");
subscriber.onCompleted();
}).switchIfEmpty(Observable.create(subscriber -> {
System.out.println("Generating item");
subscriber.onNext("item");
subscriber.onCompleted();
})).subscribe(
s -> System.out.println("onNext: " + s),
throwable -> System.out.println("onError"),
() -> System.out.println("onCompleted")
);

关于rx-java - RxJava 的后备 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com