我在同一个活动中有4个API调用。其中3个是相互独立的。我想在前三个完成后拨打4号,我不确定每次执行前3个。我从数据库中获取数据然后它将调用。它可以是1个API调用,也可以是前三个中的2个或3个。 我试图顺序呼叫,但有时候在前3个完成之前开始4号。我的一些努力如下:
if(true){ // data 1 is available in database
firstRetrofitCall();
}else{
//show no data
}
if(true){ // data 2 is available in database
secondRetrofitCall();
}else{
//show no data
}
if(true){ // data 3 is available in database
thirdRetrofitCall();
}else{
//show no data
}
fourthRetrofitCall(); // I would like to execute this after first three finished
是否可以使用 RxJava进行管理?
答案 0 :(得分:6)
使用Rxjava2适配器和Retrofit然后你可以使用Rxjava的zip运算符来组合前三个这样的调用(假设你的调用分别返回X,Y,Z值,而XYZwrapper只是这些的容器)然后使用flatMap运算符来执行第四次电话。
Single.zip(
firstRetrofitCall(),
secondRetrofitCall(),
thirdRetrofitCall(),
Function3<X, Y, Z, XYZwrapper> { x, y, z -> return@Function3 XYZwrapper(x, y, z) }
)
.subscribeOn(Schedulers.io())
.flatMap { XYZwrapper -> fourthRetrofitCall().subscribe() }//chaining
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy( onError = {}, onSuccess = {})
答案 1 :(得分:1)
声明一个大小为3的布尔数组,并将其索引初始化为false。在每个前三个API调用的onResponse方法中将索引更新为true。例如,为API调用1将索引0设置为true,依此类推。并检查onResponse方法,如果为true,则每个数组索引都为true,然后调用第四个API。
答案 2 :(得分:-1)
为每个调用添加一个布尔标志
boolean isFirstExecuted;
boolean isSecondExecuted;
boolean isThirdExecuted;
if(true){ // data 1 is available in database
firstRetrofitCall();
}else{
isFirstExecuted = true;
}
if(true){ // data 2 is available in database
secondRetrofitCall();
}else{
isSecondExecuted = true;
}
if(true){ // data 3 is available in database
thirdRetrofitCall();
}else{
isThirdExecuted = true;
}
checkAndExceuteFourth();
onFirstResponse(){
isFirstExecuted = true;
checkAndExceuteFourth();
}
onSecondResponse(){
isSecondExecuted = true;
checkAndExceuteFourth();
}
onThirdResponse(){
isThirdExecuted = true;
checkAndExceuteFourth();
}
检查和执行第四次
的方法 public void checkAndExceuteFourth(){
if(isFirstExecuted && isFirstExecuted && isFirstExecuted ){
fourthRetrofitCall();
}
}