Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我需要上一个改造服务的结果时,如何使用RxJava链接几个改造服务?_Android_Asynchronous_Retrofit2_Rx Java2 - Fatal编程技术网

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()
调用,以确保在离开屏幕之前完成所有操作(如上所示)