【问题标题】:rxjava + retrofit - How to wait and get the result of first observable in android?rxjava +改造-如何等待并获得android中第一个可观察的结果?
【发布时间】:2019-02-21 19:07:46
【问题描述】:

我最近开始学习retrofit 和rxjava。我正在寻找有关如何等待获得第一个可观察结果的任何想法。基本上,我想将它应用于简单的登录。第一个 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());

现在,我被困在这里了。在第二个 observable 上,特别是在 getNetworks 方法上,我想使用从第一个 observable 中得到的东西。有什么想法吗?

编辑:

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

【问题讨论】:

  • 我认为使用flatMap 可以解决您的问题。你试过了吗
  • 好吧,我换个方式说,如果你能同时带上 2 个数据,我的意思是 1st 和 2nd observable,可以吗?然后你可以玩对象或集合。

标签: android rx-java retrofit retrofit2


【解决方案1】:

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

LocalServerInterface apiInterface = retrofit.create(LocalServerInterface.class)

并且要使第二个 observable 以第一个 observable 的结果开始,您需要执行flatMap

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

请参阅flatMap documentation 了解更多信息。

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

【讨论】:

  • 感谢您的提示。您给出的示例将时间直接映射到第二个可观察对象,对吗?如果我想先处理时间并将其用于第二个 observable,该怎么办?
  • 我得到了 1.7 语言不支持的 lambda 表达式
  • 在 getTime 之后使用 map 运算符来转换你的时间。 Observable serverNetworkObservable = apiInterface .getTime() .map(...) .flatMap(time -> apiInterface.getNetworks(time, anothervalue))
猜你喜欢
  • 1970-01-01
  • 2018-07-05
  • 2012-05-04
  • 2012-07-27
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多