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