android - 如何知道使用 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 都可以
解决方案
//在您的 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());
}
推荐阅读
- python - Python Pandas:计算组内的移动平均值
- forms - 结构值的 StructKeyList() 等效项
- future - 取消异步未来是否有用?
- angular - 如何检查是否从订阅()中调用了服务方法
- c# - 为类及其后代的所有属性添加属性
- java - “简单”If 语句在一小段代码中不起作用 [初学者] [Java]
- python - auto-py-exe - 无法转换 (.py) 脚本 - “一个二进制文件添加了两个内部名称”
- javascript - POST 后使用 Vue.js 解码 href URL 链接和重定向页面
- javascript - webpack 块和 vue.js 组件的浏览器缓存问题
- python - 关于 ipython 需要一个缩进块