如何在RxJava中使用CONCAT运算符从第一个使用变量将其传递给第二个可观察的变量

时间:2018-07-30 11:21:14

标签: android retrofit2 rx-java2

我最近学会了使用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());

Answer 我发现使用合并功能很有用


扩展以上问题:

  • 我有一个类似的问题:如何等待第一个可观察到的 完成移动到第二到第三到第四。由于我正在使用 从第一个可观察值获得的变量将其传递给第二个,依此类推 直到第四次可观察到

CONCAT-我认为搜索是实现这一目标的好方法。

如何使用CONCAT,就像我在上面使用过MERGE一样?

1 个答案:

答案 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请求顺序无关紧要,则并行(并行运行)请求是可以的(甚至是理想的选择)。