Android 改装拦截器无法链接更新的 Prefs 值

Android retrofit interceptor cannot chain updated Prefs value

这是我的拦截器,为所有传出请求链接。在“/login”请求之后,令牌被更新。我正在使用 easyprefs 访问 sharedpreference。但是下一个请求,更新的 AUTH_TOKEN 值没有链接。有人建议解决方法。

class AuthInterceptor : Interceptor {
    val token = Prefs.getString("AUTH_TOKEN", "")
    val authToken = "Bearer $token"

    override fun intercept(chain: Interceptor.Chain): Response {
        val newRequest = chain.request().newBuilder()
            .addHeader("Api-key", "xxx-xxx-xadxsdx-fsccsag-xxx-xx")
            .addHeader("Authorization", authToken)
            .build()

        return chain.proceed(newRequest)
    }
}

您可能使用了一个 Singleton 实例,这就是实例变量将被初始化一次的原因。使用此结构,您应该在 #intercept() 内获得偏好值,以便每次都能获得更新的值。

class AuthInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val token = Prefs.getString("AUTH_TOKEN", "")
        val authToken = "Bearer $token"
        val newRequest = chain.request().newBuilder()
            .addHeader("Api-key", "xxx-xxx-xadxsdx-fsccsag-xxx-xx")
            .addHeader("Authorization", authToken)
            .build()
        return chain.proceed(newRequest)
    }
}

您需要在保存后读取授权令牌,而不是在实例化拦截器时读取:

class AuthInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val token = Prefs.getString("AUTH_TOKEN", "")
        val authToken = "Bearer $token"

        val newRequest = chain.request().newBuilder()
            .addHeader("Api-key", "xxx-xxx-xadxsdx-fsccsag-xxx-xx")
            .apply {
                if (!token.isNullOrEmpty()) {
                    addHeader("Authorization", authToken)
                }
            .build()

        return chain.proceed(newRequest)
    }
}