java - 改造同步调用异步调用

标签 java android retrofit synchronous

这看起来很奇怪,但我最终遇到了这种情况。使用 Retrofit 异步实现 Restful API 调用。现在需求突然发生变化,必须一个接一个地调用 API(一次一个),因此在第二次 API 调用中我必须发送从上一个响应中收到的 session token 。一种方法是使每个 API 调用同步,但实现此更改需要时间。

我试过了:

  1. 使用 setExecutor(Executors.newSingleThreadExecutor(),new MainThreadExecutor) 用于 RestAdapter.Builder。这没有用 因为 API 调用是异步的并且在获得响应之前 先前的 API 调用进行了第二次调用。所以第二个请求有 无效的 session token 。

  2. 在我实现了所有 Restful Web 服务的类中, 使用 Executors.newSingleThreadExecutor() ,这也没有用 出于同样的原因。

    谁能建议如何用最少的更改解决这个问题。
    Webservice Manager如下,这是部分的,还有很多类似登录的api:

public class WebServiceManager {
    private static final String ROOT_PATH = Urls.REST_ROOT_URL;
    RestAdapter restAdapter;
    WebServiceInterface webServiceInterface;
    private String requestKey;
    private String sessionId;
    private Context context;

    public WebServiceManager(Context context) {
        this.context = context;
        initializeWebServiceAdapter();
    }

    private void initializeWebServiceAdapter() {
        restAdapter = new RestAdapter.Builder()
                .setEndpoint(ROOT_PATH)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        webServiceInterface = restAdapter.create(WebServiceInterface.class);
    }

    private void setHeaderValues(BaseModel model) {
     SessionManager sm=  context.getApplicationContext().getSessionManager();
        model.getRequestHeader().setRequestKey(sm.getRequestKey());
        model.getRequestHeader().setSessionId(sm.getSessionId());
    }

    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)
                    {
                        SessionManager sm=  context.getApplicationContext().getSessionManager();
                        sm.setSessionDetails(response.getRequestKey(),response.getSessionId());
                        loginModelWebServiceCallback.success(loginModel);
                    }
                }

                @Override
                public void failure(RetrofitError error) {
                    if (loginModelWebServiceCallback != null)
                        loginModelWebServiceCallback.failure(error);
                }
            });
        } 

}

最佳答案

Executor 无关紧要,因为您总是使用 Callback 参数调用 Retrofit 服务,这使其成为异步的。如果您希望您的 Retrofit 调用是同步的,那么服务调用方法需要一个返回类型,而不是 void。您可以在文档中阅读此内容。

一旦您使 API 调用同步并按照您的需要排序,您就可以将它们包装在一个 Runnable 中,让一个 Executor 为您处理线程。

关于java - 改造同步调用异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348528/

相关文章:

java - 在 Java 中查找多核代码的执行时间

android - 试图强制 Activity with Theme.Dialog 固定宽度

java - Android 操作栏标题文本在某些手机上不可点击

android - 使用 Retrofit 和 RxJava,当 JSON 不直接映射到模型对象时,如何反序列化 JSON?

java - 无法在 Android < 21 中使用 Retrofit 2 连接到 HTTPS

java - android.content.ActivityNotFoundException : Unable to find explicit activity class { have you declared this activity in your AndroidManifest. xml?

java - 如何在java8中的JavaScript引擎中使用java对象

java - 应用程序上下文使用 Dagger?

android - 如何为音乐播放器的播放暂停服务

java - 将 Retrofit 与 Imgur 的 API 结合使用