Android 当我需要上一个改造服务的结果时,如何使用RxJava链接几个改造服务?
供应商负责检索要执行的库存详细信息。 我有两个服务,一个是获取可用库存,另一个是提供给定库存的详细信息 首先看一下我的改装界面Android 当我需要上一个改造服务的结果时,如何使用RxJava链接几个改造服务?,android,asynchronous,retrofit2,rx-java2,Android,Asynchronous,Retrofit2,Rx Java2,供应商负责检索要执行的库存详细信息。 我有两个服务,一个是获取可用库存,另一个是提供给定库存的详细信息 首先看一下我的改装界面 public interface RetrofitApiService { @GET("inv.svc/availableInventories") Single<AvailableInventories> getAvailableInventories(); @GET("inv.svc/inventoryDetails")
public interface RetrofitApiService {
@GET("inv.svc/availableInventories")
Single<AvailableInventories> getAvailableInventories();
@GET("inv.svc/inventoryDetails")
Single<InventoryDetails> getInventoryDetails(@Query("invName") String invName);
}
那我就得打电话了
getInventoryDetails("az2r8")
store in database, table inventory_line_details
getInventoryDetails("d8f5s")
store in database, table inventory_line_details
getInventoryDetails("g8z3d")
store in database, inventory_line_details
最后,我需要重定向到另一个屏幕
我如何在RxJava中做到这一点?
以前我会使用简单的android asynctasks,并使用.execute.get()
然而,似乎我不能用RXJava做到这一点
我必须调用第一个服务,然后使用类似于.iterate
或.forEach
的方法为每个结果调用我的getInventoryDetails
服务
我完全迷路了
难道我没有办法做这样的事吗
compositeDisposable.add(simpleRetrofitService.getAvailableInventories()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(this::storeNamesToDatabse, this::logErrorAndDisplayPopup)); <-make it blocking and store AvailableInventories somewhere
for (InventoryName inventoryName : availableInventories) {
compositeDisposable.add(simpleRetrofitService.getInventoryDetails()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(this::storeDetailsToDatabse, this::logErrorAndDisplayPopup)); <-make it blocking and store InventoryDetails somewhere
}
goToNextScreen()
compositeDisposable.add(simpleRetrofitService.getAvailableInventories())
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(this::storeNamesToDatabse,this::logerror和displaypopup)) 在您的情况下,可以使用flatMap
和zip
操作符,如下所示:
compositeDisposable.add(simpleRetrofitService.getAvailableInventories()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doOnSuccess(this::storeNamesToDatabse) // store names on success
.flatMap(this::getInventoryDetails) // once availableInventories is fetched, proceed to get details
.subscribe(inventoryDetailsList -> { // we get a list of inventoryDetails
this.storeDetailsToDatabse(inventoryDetailsList); // modify your function to use list of inventory details instead
goToNextScreen(); // go to next screen when network calls finished
}, this::logErrorAndDisplayPopup))
}
其中getInventoryDetails(…)
返回另一个Single
将在下游发出:
Single<List<InventoryDetails>> getInventoryDetails(AvailableInventories availableInventories) {
List<Single<InventoryDetails>> singles = new ArrayList<>();
for (InventoryName inventoryName : availableInventories) {
singles.add(
simpleRetrofitService.getInventoryDetails(inventoryName)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io()
);
}
return Single.zip(singles, inventoryDetailsList -> (List<InventoryDetails>) inventoryDetailsList); // here you might need to cast the result
}
Single GetInventory详细信息(AvailableInventory AvailableInventory){
List singles=new ArrayList();
for(InventoryName InventoryName:availableInventories){
单打(
simpleRetrofitService.getInventoryDetails(inventoryName)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io()
);
}
返回Single.zip(singles,inventoryDetailsList->(List)inventoryDetailsList);//这里可能需要强制转换结果
}
另外,在subscribe回调中移动您的goToNextScreen()
调用,以确保在离开屏幕之前完成所有操作(如上所示)。在您的情况下,可以使用flatMap
和zip
操作符,如下所示:
compositeDisposable.add(simpleRetrofitService.getAvailableInventories()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doOnSuccess(this::storeNamesToDatabse) // store names on success
.flatMap(this::getInventoryDetails) // once availableInventories is fetched, proceed to get details
.subscribe(inventoryDetailsList -> { // we get a list of inventoryDetails
this.storeDetailsToDatabse(inventoryDetailsList); // modify your function to use list of inventory details instead
goToNextScreen(); // go to next screen when network calls finished
}, this::logErrorAndDisplayPopup))
}
其中getInventoryDetails(…)
返回另一个Single
将在下游发出:
Single<List<InventoryDetails>> getInventoryDetails(AvailableInventories availableInventories) {
List<Single<InventoryDetails>> singles = new ArrayList<>();
for (InventoryName inventoryName : availableInventories) {
singles.add(
simpleRetrofitService.getInventoryDetails(inventoryName)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io()
);
}
return Single.zip(singles, inventoryDetailsList -> (List<InventoryDetails>) inventoryDetailsList); // here you might need to cast the result
}
Single GetInventory详细信息(AvailableInventory AvailableInventory){
List singles=new ArrayList();
for(InventoryName InventoryName:availableInventories){
单打(
simpleRetrofitService.getInventoryDetails(inventoryName)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io()
);
}
返回Single.zip(singles,inventoryDetailsList->(List)inventoryDetailsList);//这里可能需要强制转换结果
}
另外,在subscribe回调中移动goToNextScreen()
调用,以确保在离开屏幕之前完成所有操作(如上所示)