【发布时间】:2019-12-25 09:33:55
【问题描述】:
场景:
- 在没有互联网的情况下打开应用,应用会尝试发出请求,但会失败
- 打开互联网连接,然后按重试按钮触发互联网请求
- 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 客户端可以解决问题,但我认为这不是一个好主意。
【问题讨论】: