我最近学会了使用merge,将4个API请求合并为一个输出。 (Reference: https://stackoverflow.com/q/51262421/1083093)
Restapi.class
/************/
@GET("app/dashboard")
Observable<CategoryHomeModel[]> getCategories(@HeaderMap Map<String, String> headers);
@GET("app/wallet/balance")
Observable<WalletBalance> getWalletBalance(@HeaderMap Map<String, String> headers);
@GET("/app/swap/myrateswaps")
Observable<SwapSettings> rateMySwap(@HeaderMap Map<String, String> headers);
@GET("/app/getsettings")
Observable<Settings> getSettings(@HeaderMap Map<String, String> headers);
/************/
Observable<CategoryHomeModel[]> categoriesObservable = retrofit
.create(Restapi.class)
.getCategories(prepareHeaders())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
Observable<WalletBalance> walletObservable = retrofit
.create(Restapi.class)
.getWalletBalance(prepareHeaders())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
Observable<Settings> settingsObservable = retrofit
.create(Restapi.class)
.getSettings(prepareHeaders())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
Observable<SwapSettings> ratingsObservable = retrofit
.create(Restapi.class)
.rateMySwap(prepareHeaders())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
扩展以上问题:
CONCAT-我认为搜索是实现这一目标的好方法。
如何使用CONCAT,就像我在上面使用过MERGE一样?
答案 0 :(得分:0)
您需要的是FLATMAP运算符。它将可观察对象发射的项目映射到新的可观察对象。对于翻新可观察对象使用便利,因为可观察对象只能发出一个结果项。因此,我们可以将可观察项(请求结果)转换为可观察的代表顺序中的下一个请求。
参考原始问题的可观察示例,代码可能看起来像这样(假设使用Java 8 / RetroLambda中的lamda语法):
categoriesObservable.flatMap(categoryHomeModel -> {
/* Work on categoryHomeModel result; you can use it to configure next request */
return walletObservable.flatMap(walletBalance -> {
/* Work on walletBalance result; you can use it to configure next request */
return settingsObservable.flatMap(settings -> {
/* Work on settings result; you can use it to configure next request */
return ratingsObservable;
});
});
}).subscribe(swapSettings -> { /* Work on swapSettings; sequence is done */ });
这将确保您的请求按顺序执行。即使使用CONCAT,结果也会按顺序发送给订阅者,但是实际请求可能会并行开始,有时这是不可预期的。如果您有真正独立的请求(例如查询不同类型的数据),并且实际的HTTP请求顺序无关紧要,则并行(并行运行)请求是可以的(甚至是理想的选择)。