对于两个不同的 API,我有两个不同Retrofit
的实例。我也有两个不同OkHttp3
的客户端,但它们共享相同Authenticator
,因为两个 API 的身份验证令牌相同。
问题是,当令牌过期时,有时(但几乎总是)其中一个Retrofit
/OkHttpClient
对象不会在 HTTP 401 上调用Authenticator
'authenticate
方法。它会愉快地进行 API 调用,所有都将以 401 结束,并且身份验证器被完全忽略。在这种情况下,当第二个Retrofit
进行 API 调用时,它将收到 401 并被authenticate
调用,令牌被刷新,一切恢复正常。包括第二个Retrofit
API,它以 401 失败所有调用。
更大的问题是这种行为是随机的,但失败的原因是超过一半的令牌过期。我们已经尝试了两个Retrofit
实例,一个共享OkHttp3
客户端,两个OkHttp3
客户端共享拦截器和验证器,最后还有非共享拦截器和验证器。即使在最后一种情况下,所有事物都有自己的实例,在某些 401 错误上也不会调用身份验证。
Interceptor
s 工作,他们将旧令牌注入标头,只是Authenticator
'authenticate
方法不会在每个 HTTP 401 错误上调用。
单步执行调试器时,这永远不会发生,并且始终会调用身份验证。这对我来说似乎是一个多线程问题。Android Studio 中禁用了即时运行。在装有 Android 6 的真实设备上运行。
编辑: OkHttp 3.10.0、Retrofit 2.4.0、android 编译 SDK 27 和构建工具 28.0.1