我想异步执行 2 个网络调用 - 我正在使用 Retrofit+RxJava 来完成这个。这个逻辑来自一个简单的 Runner 类来测试解决方案。注意:这主要涉及服务器端的 RxJava。

我的代码如下所示:

public static void main(String[] args) throws Exception { 
  Api api = ...; 
 
  Observable.combineLatest( 
      api.getStates(), 
      api.getCmsContent(), 
      new Func2<List<States>, CmsContent, String>() { 
        @Override public String call(List<State> states, CmsContent content) { 
          ... 
          return "PLACEHOLDER"; 
        } 
      }) 
      .observeOn(Schedulers.immediate()) 
      .subscribeOn(Schedulers.immediate()) 
      .subscribe(new Observer<String>() { 
        @Override public void onCompleted() { 
          System.out.println("COMPLETED"); 
        } 
 
        @Override public void onError(Throwable e) { 
          System.out.println("ERROR: " + e.getMessage()); 
        } 
 
        @Override public void onNext(String s) { 
          // I don't care what's returned here 
        } 
      }); 
} 

三个问题:
  • Observable.combineLatest当您想要异步执行多个 REST 调用并在所有调用完成后继续时使用的最佳运算符?
  • 我的 Func2实现当前返回 String .在 2 个 API 调用执行后,我将处理 Func2#call() 中的结果。方法。我不在乎返回什么——不过,必须有更好的方法来处理这个问题——我说得对吗?
  • 使用上面的代码正确执行 API 调用。但是main方法没有以正确的方式完成 Process finished with exit code 0当我运行程序时。什么可能导致代码挂起?

  • 更新 - 2015-05-14

    根据建议,我已将逻辑更改为以下内容:
    public static void main(String[] args) throws Exception { 
      Api api = ...; 
     
      Observable.zip( 
          api.getStates(), 
          api.getCmsContent(), 
          new Func2<List<States>, CmsContent, Boolean>() { 
            @Override public Boolean call(List<State> states, CmsContent content) { 
              // process data 
              return true; 
            } 
          }) 
          .subscribeOn(Schedulers.io()) 
          .toBlocking() 
          .first(); 
    } 
    

    这看起来像我正在寻找的解决方案。我将使用它一段时间,看看我是否遇到任何麻烦。

    请您参考如下方法:

    1) 如果您知道在两条路径上都有一个值,那么它与 zip 一样好.

    2)你想做什么?您将在 Func2 中获得一对值如果您真的不关心 onNext 的旅行内容,返回您选择的值。

    3) Schedulers.immediate()从某种意义上说,它不是真正的调度程序,并且很容易出现同池死锁场景。你真的不需要使用它。如果你想阻塞主线程直到异步工作完成,使用 toBlocking().first()例如。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!