У меня есть два разных экземпляра Retrofit
для двух разных API.У меня также есть два разных клиента OkHttp3
, но они используют один и тот же Authenticator
, потому что токен аутентификации одинаков для обоих API.
Проблема заключается в том, что когда срок действия токена истекает, иногда (но почти всегда) один из объектов Retrofit
/ OkHttpClient
не будет вызывать метод Authenticator
authenticate
в HTTP 401. Он с радостью выполнит вызовы API, и все закончится 401, и аутентификатор полностьюигнорируются.В этом случае, когда второй Retrofit
совершает вызов API, он получает 401 и вызывается authenticate
, токен обновляется, и все возвращается в нормальное состояние.Включая второй Retrofit
API, который отказывал во всех вызовах с 401.
Более серьезная проблема заключается в том, что такое поведение является случайным, но сбой происходит более чем на половине срока действия токенов.Мы попробовали два Retrofit
экземпляра с одним общим OkHttp3
клиентом, затем два OkHttp3
клиента с общими перехватчиками и аутентификатором и, наконец, также не разделяемые перехватчики и аутентификаторы.И даже в последнем случае, когда все имеет собственный экземпляр, аутентификация не вызывается при некоторых ошибках 401.
Interceptor
s, они вводят старый токен в заголовки, просто Authenticator
's authenticate
метод вызывается не при каждой ошибке HTTP 401.
При переходе через отладчик этого никогда не происходит, и всегда вызывается аутентификация.Это похоже на многопоточность для меня.Мгновенный запуск отключен в Android Studio.Запуск на реальном устройстве с Android 6.
РЕДАКТИРОВАТЬ: OkHttp 3.10.0, Retrofit 2.4.0, Android-компиляция SDK 27 и инструменты сборки 28.0.1