我在Android应用程序OkHttp3
Interceptor
中遇到一个非常奇怪的问题,在该应用程序中我为不同的构建变体设置了不同的日志记录级别。
我在我的应用中设置了OkHttp3
Interceptor
来拦截API请求,如果任何API返回401
错误,则拦截器将从后端获取刷新的令牌,并使用新令牌更新原始请求的标头,并重复一遍。我们将此称为RefreshTokenInterceptor。我在构建我的OKHttpClient
时添加了这个拦截器。除此之外,我还添加了一个HttpLoggingInterceptor
来记录API请求和响应,或者在发布版本的情况下停止记录。我们称之为LoggingInterceptor
这里是构建我的OkHttpClient
的代码。此代码应该足够,因为如果更改了日志记录级别,则刷新机制可以正常工作。
val loggingInterceptor = HttpLoggingInterceptor()
// changing level to Level.BODY in the below solves the issue,
// but I don't want to log the results
when {
BuildConfig.DEBUG -> loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
else -> loggingInterceptor.level = HttpLoggingInterceptor.Level.NONE
}
val httpClientBuilder = OkHttpClient.Builder()
.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
.writeTimeout(WRITE_TIMEOUT, TimeUnit.MILLISECONDS)
.addInterceptor(ConnectivityInterceptor())
.addInterceptor(TokenRefreshInterceptor())
.addInterceptor(loggingInterceptor)
.connectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)
在两种情况下,当我将LoggingInterceptor的日志记录级别设置为Level.BODY
时,一切正常。但是,如果将日志记录级别设置为Level.NONE
,则令牌刷新机制将停止工作。
更具体地说,在这种情况下,这就是RefreshTokenInterceptor中发生的事情:当请求返回401时,将进行刷新调用,但此后没有任何反应。没有成功或失败的案例被调用(可能拦截器Chain
中断了,但谁知道)。
这是我到目前为止尝试过的
Level.NONE
->不起作用Level.BODY
->可以像魔术一样今天我也对此进行了很多搜索,但是找不到混淆其他拦截器的日志记录级别之间的任何链接。任何帮助将不胜感激,如果您需要更多代码,我可以将其发布。
此问题是由于内存泄漏引起的,这是因为OkHttp3
中的Response
TokenRefreshInterceptor
对象没有关闭。我知道有关Firebase Console
的泄漏。在使用完Response
之后将其关闭即可解决此问题。但是我仍然不确定为什么在启用身体级别的日志记录时它可以正常工作。