Bol*_*aul 5 kotlin retrofit okhttp
设想:
从一开始就在启用互联网的情况下重新启动应用程序将使一切正常,除非我再次关闭它并失败请求,从那时起它会给我同样的错误。我在 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()
}
Run Code Online (Sandbox Code Playgroud)
服务类看起来像这样
@GET("something")
fun something(): Call<SomeResponse>
Run Code Online (Sandbox Code Playgroud)
我试过玩超时值,无论超时时间如何,我都会得到同样的错误。
为每个请求创建一个新的 http 客户端将解决这个问题,但我认为这不是一个好主意。
您的问题看起来像OkHttp Bug。如果您点击该链接,您会发现有关许多可能解决方案的长时间讨论。
okHttpClientBuilder.pingInterval(1, TimeUnit.SECONDS)
Run Code Online (Sandbox Code Playgroud)
问题的根源在于 Android 操作系统不提供任何方法来了解连接不再处于活动状态。因此,库连接看起来像是还活着,但实际上已经死了。结果,我们在每个请求上都会遇到超时异常。一旦我们设置了 ping,OkHttp 就开始发送Ping 帧,这样如果服务器没有响应,库就知道连接已经断开,是时候创建一个新的了。
okHttpClientBuilder.connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
Run Code Online (Sandbox Code Playgroud)
okHttpClientBuilder.protocols(listOf(Protocol.HTTP_1_1))
Run Code Online (Sandbox Code Playgroud)
在这两种不推荐的解决方案中,您只需停止重用已打开的连接,这会使每个请求时间更长一些。
| 归档时间: |
|
| 查看次数: |
562 次 |
| 最近记录: |