android - 使用 RxJava 和 Retrofit 链接两个 Web 服务调用

标签 android retrofit rx-java

我正在使用 RxJava 和 Retrofit。我的基本要求是,我想链接两个 api 调用,它们将一个接一个地被调用。从第一个 api 收到的响应在调用第二个 api 时用作输入。在互联网上阅读了一些东西后,我曾经使用平面图来实现这一点。在执行此操作时,我正在显示加载器。有时它运行平稳但在某些情况下该加载器会卡住。 DDMS 显示“跳过 300 帧,应用程序可能在其主线程上做了太多工作”的日志。我怀疑我的一个网络调用正在主线程上运行。我无法弄清楚如何链接这两个调用,以便可以在后台顺利调用它们而不会妨碍我的主线程。任何帮助是极大的赞赏 。提前致谢 这是我到目前为止尝试过的

private CompositeSubscription mSubscriptions = new CompositeSubscription();

Subscription subscription = Observable.just(getAddress())
          .subscribeOn(Schedulers.newThread())
          .flatMap(address -> mPlatformApi.secondWebService(address.getLatitude(),address.getLongitude())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(modelTwo ->
          {
            //updating My ui
          }, throwable -> {

            //Error Handling
          });

mSubscriptions.add(subscription);


private android.location.Address getAddress(){
    String addressString = "";//some Address String
    Geocoder coder = new Geocoder(getActivity());
    android.location.Address address=null;
    try {
      ArrayList<android.location.Address> addressList = (ArrayList<android.location.Address>) coder.getFromLocationName(addressString, 1);
      if(addressList !=null && addressList.size()>0) {
        address = addressList.get(0);
      } else {

      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return address;
  }

//My Retrofit call
Observable<modelTwo> secondWebService(@Path("lat") double lat,@Path("lon") double lon);

最佳答案

考虑一下:

final android.location.Address address = getAddress();
Subscription subscription = Observable.just(address) ...

这等同于您的代码,但也应该清楚地说明 getAddress() 是在 RxJava 参与之前评估的,并且有任何机会进行干预。换句话说,当您使用 just 时,subscribeOn 只能移动地址的 emission(调用 onNext(address) 在你的 Subscriber 上) 到另一个线程。然而,地址的创建 - 即您的 getAddress - 当您到达这一点时,已经在主线程上发生了。

实际将 getAddress 移动到另一个线程的最简单方法是使用 defer:

Subscription subscription = Observable.defer(new
          Func0<Observable<android.location.Address>>() {

              @Override
              public Observable<android.location.Address> call() {
                  return Observable.just(getAddress());
              }
          })
          .subscribeOn(Schedulers.newThread())
          .flatMap(address -> mPlatformApi.secondWebService(address.getLatitude(),address.getLongitude()    )
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(modelTwo ->
          {
            //updating My ui
          }, throwable -> {
            //Error Handling
          });

这样,整个 Func0 将在 newThread() 上执行 - 不仅是 just,还有 getAddress.

关于android - 使用 RxJava 和 Retrofit 链接两个 Web 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736775/

相关文章:

android - 问题 "Entry name ' META-INF...' 碰撞 - Android

android - Mockito MockApi 返回 null

android - 无法与 picasso 和 okhttp 一起设置 retrofit 超时

android - Rxjava 返回 LiveData 列表

java - .zip 方法中的 Observable 数量是否有限制?

android - 从 Android 应用程序访问 Chromebook 的本地主机?

android - fragment 错误

java - TextView 椭圆在 setText() 上消失

json - Square 的 Retrofit 响应解析逻辑 : streaming?

java - 如何在 RxJava 服务器轮询中对 "repeatWhen"进行单元测试