Retrofit
2 つの異なる API に対して 2つの異なるインスタンスがあります。私も 2 つの異なるOkHttp3
クライアントを持っていますがAuthenticator
、両方の API で認証トークンが同じであるため、同じものを共有しています。
問題は、トークンの有効期限が切れると、ときどき(ただしほとんどの場合) Retrofit
/OkHttpClient
オブジェクトの 1 つが HTTP 401 でAuthenticator
のauthenticate
メソッドを呼び出さないことです。喜んで API 呼び出しを行い、すべてが 401 で終了し、オーセンティケーターは完全に無視されます。この場合、2 番目Retrofit
が API 呼び出しを行うと、401 を受け取り、authenticate
が呼び出され、トークンが更新され、すべてが正常に戻ります。Retrofit
401 ですべての呼び出しに失敗していた 2 番目の APIを含めます。
より大きな問題は、この動作はランダムですが、失敗はトークンの有効期限の半分以上であるということです。Retrofit
1 つの共有OkHttp3
クライアントで2 つのインスタンスを試し、次に共有インターセプターとオーセンティケーターを使用して 2 つのOkHttp3
クライアントを試し、最後に非共有インターセプターとオーセンティケーターも試しました。最後のケースでも、すべてが独自のインスタンスを持っているため、一部の 401 エラーでは認証が呼び出されません。
Interceptor
s が機能し、ヘッダーに古いトークンを挿入します。HTTP 401 エラーごとにAuthenticator
'sメソッドが呼び出されるわけではありません。authenticate
デバッガーをステップスルーするとき、これは決して起こらず、常に認証が呼び出されます。これは、マルチスレッドの問題のように見えます。Android Studio では Instant Run が無効になっています。Android 6 を搭載した実機での実行。
編集: OkHttp 3.10.0、レトロフィット 2.4.0、アンドロイド コンパイル SDK 27 およびビルド ツール 28.0.1