场景:
- 无网络情况下打开应用,应用将尝试发送请求,但会失败。
- 打开网络连接,点击重试按钮以触发网络请求。
- Retrofit & okhttp 一直给出 HTTP FAILED: java.net.SocketTimeoutException: timeout 错误。
重新启动应用并在启动时开启互联网连接将使一切正常工作,除非我再次关闭它并且请求失败了,从那时起,它将给我相同的错误。 我从未在Java上遇到过这个问题,只在Kotlin上遇到。
private val interceptor: Interceptor =
object : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
var builder = chain.request().newBuilder()
Prefs.token?.let { token ->
builder = builder.addHeader("Authorization", "Bearer $token")
}
return chain.proceed(builder.build())
}
}
private val httpLoggingInterceptor: HttpLoggingInterceptor by lazy {
val interceptor = HttpLoggingInterceptor()
interceptor.level =
if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
interceptor
}
private val httpClient: OkHttpClient by lazy {
OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(interceptor)
.build()
}
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.baseUrl("https://api.secret.com/v1/")
.addConverterFactory(GsonConverterFactory.create(gson))
.client(httpClient)
.build()
}
服务类看起来像这样
@GET("something")
fun something(): Call<SomeResponse>
我尝试了不同的超时时间,但无论设置多长时间,我都会得到相同的错误。
为每个请求创建一个新的http客户端可以解决这个问题,但我认为这不是一个好主意。