3

Retrofit2 つの異なる API に対して 2つの異なるインスタンスがあります。私も 2 つの異なるOkHttp3クライアントを持っていますがAuthenticator、両方の API で認証トークンが同じであるため、同じものを共有しています。

問題は、トークンの有効期限が切れると、ときどき(ただしほとんどの場合) Retrofit/OkHttpClientオブジェクトの 1 つが HTTP 401 でAuthenticatorauthenticateメソッドを呼び出さないことです。喜んで API 呼び出しを行い、すべてが 401 で終了し、オーセンティケーターは完全に無視されます。この場合、2 番目Retrofitが API 呼び出しを行うと、401 を受け取り、authenticateが呼び出され、トークンが更新され、すべてが正常に戻ります。Retrofit401 ですべての呼び出しに失敗していた 2 番目の APIを含めます。

より大きな問題は、この動作はランダムですが、失敗はトークンの有効期限の半分以上であるということです。Retrofit1 つの共有OkHttp3クライアントで2 つのインスタンスを試し、次に共有インターセプターとオーセンティケーターを使用して 2 つのOkHttp3クライアントを試し、最後に非共有インターセプターとオーセンティケーターも試しました。最後のケースでも、すべてが独自のインスタンスを持っているため、一部の 401 エラーでは認証が呼び出されません。

Interceptors が機能し、ヘッダーに古いトークンを挿入します。HTTP 401 エラーごとにAuthenticator'sメソッドが呼び出されるわけではありません。authenticate

デバッガーをステップスルーするとき、これは決して起こらず、常に認証が呼び出されます。これは、マルチスレッドの問題のように見えます。Android Studio では Instant Run が無効になっています。Android 6 を搭載した実機での実行。

編集: OkHttp 3.10.0、レトロフィット 2.4.0、アンドロイド コンパイル SDK 27 およびビルド ツール 28.0.1

4

0 に答える 0