RxJava-在第一个调用是有条件的情况下进行两个调用
我正在使用RXJava2进行API调用。 我得打个电话取消订课 但我必须做或不做一个以前的电话,以获得丢失的信息 是这样的:RxJava-在第一个调用是有条件的情况下进行两个调用,java,android,retrofit,rx-java2,Java,Android,Retrofit,Rx Java2,我正在使用RXJava2进行API调用。 我得打个电话取消订课 但我必须做或不做一个以前的电话,以获得丢失的信息 是这样的: if classId not exists get classId then unbook class else unbook class 我不想重复未绑定的类代码 以下是简化的代码: FitnessDataService service = RetrofitInstance.getRetrofitInstance().create(FitnessDa
if classId not exists
get classId
then unbook class
else
unbook class
我不想重复未绑定的类代码
以下是简化的代码:
FitnessDataService service = RetrofitInstance.getRetrofitInstance().create(FitnessDataService.class);
// if we don't have the aid of class (reserved), we get it from the reserved classes
if (fitClass.getAid() == null) {
service.getReservedClasses(FitHelper.clientId)
.flatMap(reservedClasses ->
{
// get the class ID from reserved classes
...
return service.unbookClass(fitClass.getAid());
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
// success
}, err ->
// error
} else {
service.unbookClass(fitClass.getAid())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
// success
}, err ->
// error
}
如您所见,service.unbokClass是重复的。
如果我没有类id(fitClass.getAid()==null),如何始终调用此service.unbokClass并仅调用service.getReservedClass
无需对第二次调用重复代码。我建议将id的实际来源分离为它自己单独的可观察对象。可能是这样的:
Observable<Long> idObservable;
if (fitClass.getAid() == null) {
idObservable = service.getReservedClasses(FitHelper.clientId)
.map({ reservedClasses ->
/* Get the Id and do stuff with it */
return fitClass.getAid();
});
} else {
idObservable = Observable.just(fitClass.getAid());
}
idObservable.flatMap({ aid -> service.unbookClass(aid) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* TODO */);
可观察到的i可观察到的;
if(fitClass.getAid()==null){
idObservable=service.getReservedClass(FitHelper.clientId)
.map({ReservedClass->
/*拿到身份证,用它做些事情*/
返回fitClass.getAid();
});
}否则{
idObservable=Observable.just(fitClass.getAid());
}
idObservable.flatMap({aid->service.unbokClass(aid)})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
。认购(/*TODO*/);
看起来很适合使用and开关ifempty
。如果返回的值不为null,则fromCallable
方法将返回1个值,如果返回的项为null
,则该方法将仅返回完成<如果源未发出项目,则代码>开关IFEMPTY可用于提供备用(单个或在本例中可能是单个)。如果您对unbokClass
的改装调用返回一个,那么您的代码看起来像--
我已经实现了这一点,效果很好。谢谢:)刚刚将.map更改为.flatMap,因为我只想从reservedClasses列表中获取一个值。感谢您让我了解Maybe操作符和
开关ifempty
。尽管如此,我在实现这一点上遇到了一些麻烦。我对unbokClass
的改装调用返回一个可观察(observeable
)。适应是否简单?是的,只需在改装界面中返回Single
。大多数改装调用只返回一个元素,然后调用onComplete
,这与单个相同
谢谢。我将我的改装调用更改为返回也许
,这样,这种方法效果很好。我想我还可以继续使用可观察的
,然后使用.singleElement()
Maybe.fromCallable(() -> fitClass.getAid())
.switchIfEmpty(service.getReservedClasses(FitHelper.clientId)
.flatMap(reservedClasses -> {
// ....
return fitClass.getAid());
}))
.flatMap(id -> service.unbookClass(id))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);