Java 同步调用异步调用的改进

Java 同步调用异步调用的改进,java,android,retrofit,synchronous,Java,Android,Retrofit,Synchronous,这看起来很奇怪,但我最终陷入了这样的境地。使用异步改造实现了Restful API调用。现在有一个突然的需求变化,必须一个接一个地调用API(一次调用一个),因此在第二个API调用中,我必须发送从上一个响应接收到的会话令牌。一种方法是使每个API调用都是同步的,但实现这种更改需要时间 我试过: 已使用setExecutor(Executors.newSingleThreadExecutor(),新建 MainThreadExecutor)用于RestAdapter.Builder。这不起作用 因

这看起来很奇怪,但我最终陷入了这样的境地。使用异步改造实现了Restful API调用。现在有一个突然的需求变化,必须一个接一个地调用API(一次调用一个),因此在第二个API调用中,我必须发送从上一个响应接收到的会话令牌。一种方法是使每个API调用都是同步的,但实现这种更改需要时间

我试过:

  • 已使用
    setExecutor(Executors.newSingleThreadExecutor(),新建
    MainThreadExecutor)
    用于
    RestAdapter.Builder
    。这不起作用 因为API调用是异步的,并且在获取 前一个API调用进行第二个调用。因此,第二个请求已经完成 无效的会话令牌

  • 在我实现所有Restful Web服务的课程中, 使用了
    Executors.newSingleThreadExecutor()
    ,这也不起作用 出于同样的原因

    有谁能建议如何以最小的更改解决此问题。
    Webservice Manager如下所示,这是部分的,还有更多类似api的登录:


  • 执行器并不重要,因为您总是使用回调参数调用改造服务,这使得它是异步的。如果希望改造调用是同步的,那么服务调用方法需要返回类型,而不是void。你可以在文档中阅读


    一旦您使API调用同步并按所需顺序排列,您就可以将它们包装在可运行中,并让执行器为您处理线程。

    当第二个API调用需要某些参数时,可以在第一个API本身的响应中发出请求。请看一下示例:

    public void login(String emailID, String passwd, final WebServiceCallback loginModelWebServiceCallback) {
        LoginModel model = RestRequest.getLoginModel(emailID, passwd);
        setHeaderValues(model);
        webServiceInterface.login(model, new Callback() {
          @Override
          public void success(LoginModel loginModel, Response response) {
            if (loginModelWebServiceCallback != null) {
              makeSecondAPIcall();
            }
          }
    
          @Override
          public void failure(RetrofitError error) {
            if (loginModelWebServiceCallback != null)
              loginModelWebServiceCallback.failure(error);
          }
        });
      }
    

    您正在调用两个API,对吗?因此,在从第一个API获得响应后调用第二个API。是的,还有更多方法引用的代码是在从第一个API获得响应后部分调用第二个API。但要做到这一点,我必须做很多更改&需要维护一些队列,不是吗?这是唯一的解决方案吗?在这种情况下,我需要进行大量的代码重构,因此需要寻找替代解决方案。
    public void login(String emailID, String passwd, final WebServiceCallback loginModelWebServiceCallback) {
        LoginModel model = RestRequest.getLoginModel(emailID, passwd);
        setHeaderValues(model);
        webServiceInterface.login(model, new Callback() {
          @Override
          public void success(LoginModel loginModel, Response response) {
            if (loginModelWebServiceCallback != null) {
              makeSecondAPIcall();
            }
          }
    
          @Override
          public void failure(RetrofitError error) {
            if (loginModelWebServiceCallback != null)
              loginModelWebServiceCallback.failure(error);
          }
        });
      }