У меня есть ViewPager
, и три вызова webservice выполняются, когда ViewPager
загружается одновременно.
Когда первый возвращает 401, вызывается Authenticator
, и я обновляю токен внутри Authenticator
, но оставшиеся 2 запроса уже отправляются на сервер со старым токеном обновления и не удается с 498, который был захвачен в Interceptor, а приложение вышли из.
Это не идеальное поведение, которого я ожидал бы. Я хотел бы сохранить 2-й и 3-й запросы в очереди, а когда токен обновлен, повторите запрос в очереди.
В настоящее время у меня есть переменная, указывающая, продолжается ли обновление токена в Authenticator
, в этом случае я отменяю весь последующий запрос в Interceptor
, и пользователь должен вручную обновить страницу, или я могу выйти из системы пользователем и заставить пользователя войти в систему.
Что такое хорошее решение или архитектура для вышеупомянутой проблемы с использованием okhttp 3.x для Android?
EDIT: проблема, которую я хочу решить, в общем, и я не хотел бы упорядочивать мои вызовы. то есть дождаться, когда один вызов завершит и обновит токен, а затем отправит остальную часть запроса на уровень активности и фрагмента.
Был запрошен код. Это стандартный код для Authenticator
:
public class CustomAuthenticator implements Authenticator {
@Inject AccountManager accountManager;
@Inject @AccountType String accountType;
@Inject @AuthTokenType String authTokenType;
@Inject
public ApiAuthenticator(@ForApplication Context context) {
}
@Override
public Request authenticate(Route route, Response response) throws IOException {
// Invaidate authToken
String accessToken = accountManager.peekAuthToken(account, authTokenType);
if (accessToken != null) {
accountManager.invalidateAuthToken(accountType, accessToken);
}
try {
// Get new refresh token. This invokes custom AccountAuthenticator which makes a call to get new refresh token.
accessToken = accountManager.blockingGetAuthToken(account, authTokenType, false);
if (accessToken != null) {
Request.Builder requestBuilder = response.request().newBuilder();
// Add headers with new refreshToken
return requestBuilder.build();
} catch (Throwable t) {
Timber.e(t, t.getLocalizedMessage());
}
}
return null;
}
}
Некоторые вопросы, подобные этому: OkHttp и Retrofit, обновить токен с одновременными запросами