首页 > 解决方案 > 如何知道使用 Retrofit 时调用了请求超时?

问题描述

所以我需要在请求超时时显示特定屏幕。我正在使用此代码来启动改造

object RetrofitServiceGenerator {

    private val loggingInterceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

    private val okHttpClient = OkHttpClient.Builder()
        .callTimeout(7, TimeUnit.SECONDS)
        .addInterceptor(loggingInterceptor)
        .build()

    private var retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(okHttpClient)
        .build()


    fun <T> getInstance(APIType: Class<T>) : T {

        return retrofit.create(APIType)
    }

}

所以 7 秒后,我想显示一个特定的屏幕,但问题是,我不知道,如果我的代码中有请求超时,我何时收到通知。例如在我下面的代码中

    val call = restaurantService.getRestaurantDetail(restaurantID)

    call.enqueue(object: Callback<Restaurant>{
        override fun onFailure(call: Call<Restaurant>, t: Throwable) {


        }

        override fun onResponse(call: Call<Restaurant>, response: Response<Restaurant>) {


        }


    })

java 或者 kotlin 都可以

标签: androidkotlinretrofit2

解决方案


//在您的 Web 服务实例中定义一个侦听器:

public interface OnConnectionTimeoutListener 
{
void onConnectionTimeout();
}

将拦截器添加到您的 Web 服务:

public WebServiceClient() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(10, TimeUnit.SECONDS);
client.setReadTimeout(30, TimeUnit.SECONDS);
client.interceptors().add(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        return onOnIntercept(chain);
    }
});
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();
webService = retrofit.create(WebService.class);
}

//用try-catch块包围你的拦截代码,并在发生异常时通知侦听器:

private Response onOnIntercept(Chain chain) throws IOException {
try {
    Response response = chain.proceed(chain.request());
    String content = UtilityMethods.convertResponseToString(response);
    Log.d(TAG, lastCalledMethodName + " - " + content);
    return response.newBuilder().body(ResponseBody.create(response.body().contentType(), content)).build();
}
catch (SocketTimeoutException exception) {
    exception.printStackTrace();
    if(listener != null)
        listener.onConnectionTimeout();
}

return chain.proceed(chain.request());
}

推荐阅读