【问题标题】:Retrofit & OkHttp - Is it possible to send only one request at a time?Retrofit & OkHttp - 是否可以一次只发送一个请求?
【发布时间】:2018-08-25 02:21:56
【问题描述】:

我正在使用 Retrofit 2.4.0 向服务器发送请求。但有时服务器会阻止我的请求,如果它与另一个请求具有类似的时间戳(以毫秒为单位)。我需要一次发送一个请求:

  1. 请求 A 已发送
  2. 请求 B 等待,直到收到请求 A 的响应
  3. 请求 A 以成功或错误完成
  4. 请求 B 已发送

是否可以使用 Retrofit 和 OkHttp 库创建这样的队列?

【问题讨论】:

标签: android retrofit retrofit2 okhttp okhttp3


【解决方案1】:

我决定使用 Dispatcher 的 setMaxRequests 方法一次发送一个请求:

Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(1);

OkHttpClient client = new OkHttpClient.Builder()
                .dispatcher(dispatcher)
                .build()

【讨论】:

  • 在此请求之后提出的任何请求会发生什么?
【解决方案2】:

根据您的要求,您可以简单地使用 Android AsyncTankonPostExecute()。得到请求 A 的响应后,您可以调用您的请求 B。

我觉得没有必要使用 Retrofit 或 OkHttp 库。当您同时发送多个请求时,这些库非常有用。

【讨论】:

  • 感谢您的回答。我不喜欢使用 AsyncTask,它可能会导致很多问题,比如内存泄漏。此外,我需要为正在开发一年多的现有项目实现此功能。我认为将包含 OkHttp 和 Retrofit 代码的整个代码替换为 AsyncTask 需要时间。
  • OK 了解您的问题。那么也许这个会帮助你。 stackoverflow.com/questions/42299791/…
  • 谢谢你的建议帮助我找到了解决方案
【解决方案3】:

是的,您只需要调用函数或根据 API 的成功/失败结果发送请求

  private void firstRequest() {


    Call<LoginModel> call= apiInterface.getLogin("");
    call.enqueue(new Callback<LoginModel>() {
        @Override
        public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
            //function here

        }

        @Override
        public void onFailure(Call<LoginModel> call, Throwable t) {

        }
    });


}

【讨论】:

  • 感谢您的回答。这样,我需要在代码中的任何地方进行更改。我决定按照 Arnab Kundu 的建议使用 Dispatcher 的 setMaxRequests 方法。
  • 虽然它可以像这样工作,但更通用的解决方案是在 Joe 响应时使用调度程序。
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 2015-06-22
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
相关资源
最近更新 更多