gpt4 book ai didi

android - 使用 RxJava 合并结果,处理错误

转载 作者:搜寻专家 更新时间:2023-11-01 09:48:57 24 4
gpt4 key购买 nike

我有调用 2 个 API 并合并结果的代码。使用改造和 rxJava。

我该如何处理它,以便在其中一个 API 出现问题时,我仍然可以从有效的 API 之一获得结果?

 IPlaces api = adapter.create(IPlaces.class); //endpoint1
IPlaces api2 = adapter2.create(IPlaces.class); //endpoint2

Observable.combineLatest(
api.getPlacesFrom1("key", placeId),
api2.getPlacesFrom2(placeId),
new Func2<PlaceDetailResult1, PlaceDetailResult2, MergedReviews>() {
@Override
public MergedReviews call(PlaceDetailResult placeDetailResult1, PlaceDetailResult2 placeDetailResult2) {
// processToMerge( placeDetailResult1, placeDetailResult2)
return mr;
}

})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MergedReviews>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(MergedReviews mr) {

SetAdapter(mr.reviews);
SetPhotosAdapter(mr.photos);
}
});

最佳答案

如注释中所述,您可以使用 onError* 将异常转换为 null 对象(或任何其他对象)。

这是一个最小的示例,我相信它可以捕捉到您的设置。它需要两个提供一个 Integer 值的整数 observables 并以某种方式组合它们。如果其中一个 observable 产生错误,则传输另一个值,如果两者都产生错误,则抛出 RuntimeException。我使用 zipWith 而不是 combineLatest 因为这足以满足您的情况,即两个可观察量中的每一个都期望一个值。

Observable<Integer> zipThrowing(Observable<Integer> observable1, Observable<Integer> observable2) {
return observable1.onErrorReturn(ex-> null)
.zipWith(observable2.onErrorReturn(ex->null),
(a,b)->{
if(b == null) {
if(a==null){
throw new RuntimeException("None of the two values are valid.");
}
return a;
}
if(a==null) {
return b;
}
return a+b;
}
);

在某些情况下,将异常转换为 null 值可能是 Not Acceptable 。如果您需要异常中的信息,我建议您使用 result object包含实际值或异常。

关于android - 使用 RxJava 合并结果,处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36663102/

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