Retrofit 2入队方法运行 2次

Retrofit 2 enqueue method running 2 times

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

我面临的问题是,每当我过去调用改造的异步调用方法时,onResponse 方法中的功能是 运行ning 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 工作室的记录器时,它向我显示的日志消息为 -

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

这里好像运行宁了2次..!!

我不明白为什么要 运行ning 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();
}
}

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

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

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

Don't call any function from retrofit that returns "Response" more than once inside any of your interceptors.

在我的例子中,由于以下原因,它被调用了两次 chain.proceed(请求) 在同一个拦截器中调用了两次

例如

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
    }
}