【问题标题】:Retrofit 2 enqueue method running 2 times改造 2 入队方法运行 2 次
【发布时间】:2016-08-01 11:37:46
【问题描述】:

我是 Retrofit 库的新手。我正在开发一个应用程序,我必须在其中进行多次 API 调用,但是当我尝试进行第一次 API 调用时,这个问题一直困扰着我......

我面临的问题是,每当我调用改造的异步调用方法时,onResponse 方法中的功能就会运行 2 次......

这是我异步调用 API 调用时的代码...

final ApiModule apiService = ApiServiceGenerator.createService(ApiModule.class);
Call <ConfigResponse> call = apiService.getConfig();

call.enqueue(new Callback<ConfigResponse>() {
  @Override
  public void onResponse(Call<ConfigResponse> call, Response<ConfigResponse> response) {
    try {
        if (response.isSuccessful()) {
            Log.e("MyTag", "This is running");
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
  }

  @Override
  public void onFailure(Call<ConfigResponse> call, Throwable t) {
    e.printStackTrace();
  }
});

当我在设备上运行应用程序并看到我的 android studio 的记录器时,它会向我显示日志消息 -

E/MyTag: This is running
E/MyTag: This is running

这里好像跑了2次..!!

我不明白为什么它运行了 2 次。 请帮我解决这个问题...

只是为了获得更多帮助... 我已经这样实现了我的代码。

ApiModule 接口(我在其中定义了我的 API 调用 URL)

public abstract interface ApiModule {

  @GET("config")
  Call<ConfigResponse> getConfig();

}

ApiServiceGenerator 是这样的 -

public class ApiServiceGenerator {

public static final String API_BASE_URL = "https://www.example.com/";
private static OkHttpClient httpClient = new OkHttpClient.Builder()
        .addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request newRequest = chain.request().newBuilder().addHeader("App-Secret", "some-secret-key").build();
                return chain.proceed(newRequest);
            }
        })
        .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // Just For logging
        .readTimeout(60, TimeUnit.SECONDS)
        .connectTimeout(60, TimeUnit.SECONDS)
        .build();

Gson gson = new GsonBuilder()
        .registerTypeAdapterFactory(new ArrayAdapterFactory())
        .create();

private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create()));

public static <S> S createService(Class<S> serviceClass) {
    Retrofit retrofit = builder.client(httpClient).build();
    return retrofit.create(serviceClass);
}

public static Retrofit retrofit() { // For Error Handing when non-OK response is received from Server
    OkHttpClient httpClient = new OkHttpClient.Builder().build();
    OkHttpClient client = httpClient;
    return builder.client(client).build();
}
}

【问题讨论】:

    标签: android api retrofit retrofit2 asynccallback


    【解决方案1】:

    终于解决了我的问题.. 不是改造库的问题..!!

    其实是我的错。我打开片段两次(在回答这个问题之前我不知道)...... 这就是为什么片段内的代码运行了两次,这让我觉得改造响应运行了两次......

    【讨论】:

    • 还有另一个问题我遇到了确切的问题,但碰巧 enqueue 调用被直接调用了 2 次。仍然没有其他直接原因可以找到。我正在寻找可以解决此版本 2.3.0 版本的另一种解决方案。
    • @GFxJamal 也许你应该检查你的拦截器,看看你是否导致多次调用或你的改造服务构建器配置。
    【解决方案2】:

    在我的例子中,我使用了拦截器,在其中一个中我调用了 chain.proceed() 两次。也许你也应该检查一下。这不会出现在您的日志中。使用 Stetho 准确检查通话的次数。

    不要在任何拦截器中调用任何从改造中多次返回“响应”的函数。

    【讨论】:

      【解决方案3】:

      在我的情况下,它被调用了两次,因为 chain.proceed(request) 在同一个拦截器中调用了两次

      例如

      class ErrorInterceptor : Interceptor {
          override fun intercept(chain: Interceptor.Chain): Response {
      
              val request: Request = chain.request()
              chain.proceed(request)
              val response = chain.proceed(request) // it called twice in this Interceptor
              when (response.code()) {
                  
      
              }
              return response
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-15
        • 2017-10-15
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        相关资源
        最近更新 更多