rxjava + Retrofit-如何等待并获得android中第一个可观察到的结果?

时间:2018-09-17 19:56:28

标签: android rx-java retrofit retrofit2

我最近开始学习改造和rxjava。我正在寻找有关如何等待ang以获得任何可观察的结果的任何想法。基本上,我想将其应用于简单的登录。第一个api调用正在获取服务器时间。第二个api调用将等待第一个调用的结果(即服务器时间)并加以利用。

                Retrofit retrofit = RetrofitClient.getRetrofitClient();
                LocalServerInterface apiInterface = retrofit.create(LocalServerInterface .class);

                Observable<ServerTime> timeObservable = retrofit
                        .create(LocalServerInterface .class)
                        .getTime()
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread());

                Observable<ServerNetwork> serverNetworkObservable = retrofit
                        .create(LocalServerInterface .class)
                        .getNetworks(//valuefromapicall1, anothervalue)
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread());

现在,我被困在这里。在第二个可观察对象上,尤其是在getNetworks方法上,我想使用从第一个可观察对象中获得的内容。有什么想法吗?

编辑:

我想先处理调用1的结果,然后再将其提供给api调用2。有可能吗?

1 个答案:

答案 0 :(得分:9)

首先,不要每次都重新创建LocalServerInterface,请重新创建一个并重用它。创建接口实例是一项昂贵的操作。

LocalServerInterface apiInterface = retrofit.create(LocalServerInterface.class)

要使第二个可观察的结果从第一个可观察的结果开始,您需要执行flatMap

Observable<ServerNetwork> serverNetworkObservable = apiInterface
                        .getTime()
                        .flatMap(time -> apiInterface.getNetworks(time, anothervalue))
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread());

有关更多信息,请参见flatMap documentation

重要提示。在这种情况下,当第一个可观察对象仅发出一个响应时,使用flatMapconcatMap之间没有区别。对于其他情况,请考虑the difference between flatMap and concatMap