У меня есть MainActivity с 4 вкладками, и мне нужно делать запросы одновременно. Проблема заключается в том, что когда приложение открыто, и если токен истек, он не помещает другой запрос в очередь, если первый запрос получает 401. Я хочу удерживать другой запрос, если первый запрос получает ошибку аутентификации и после refre sh token all request call call again with new Токен доступа. Я синхронизировал метод authenti c, но по-прежнему не работает.
TokenAuthenticator
public class TokenAuthenticator implements Authenticator {
@Nullable
@Override
public synchronized Request authenticate(@Nullable Route route, Response response) throws IOException {
Log.d("Auth","Entering");
Context context = App.getmContext();
SharedPreferenceManager sharedPreferenceManager = SharedPreferenceManager.getInstance(context);
String client_id = context.getResources().getString(R.string.client_id1);
final String accessToken = sharedPreferenceManager.getAccessToken();
final String refreshToken = sharedPreferenceManager.getRefreshToken();
if (!isRequestWithAccessToken(response) || accessToken == null){
Log.d("Auth","access null");
return null;
}
synchronized (this){
final String newAccessToken = sharedPreferenceManager.getAccessToken();
if (!accessToken.equals(newAccessToken)){
Log.d("Auth",accessToken);
Log.d("Auth",newAccessToken);
Log.d("Auth","diff access token");
return newRequestWithAccessToken(response.request(),newAccessToken);
}
RetrofitClient retrofitClient = new RetrofitClient();
// Log.d("header", retrofitClient.client().create(LoginApi.class).refreshToken(refreshToken, "refresh_token").request().toString());
retrofit2.Response<AccessToken> accessTokenResponse = retrofitClient.client().create(LoginApi.class).refreshToken(refreshToken, "refresh_token",client_id).execute();
if (accessTokenResponse.isSuccessful()){
Log.d("Auth","success");
AccessToken access_Token = accessTokenResponse.body();
assert access_Token != null;
String access_token = access_Token.access_token;
String refresh_token = access_Token.refresh_token;
sharedPreferenceManager.setAccessToken(access_token, refresh_token);
return newRequestWithAccessToken(response.request(),access_token);
}else {
String error = accessTokenResponse.errorBody().string();
Log.d("Auth",error);
Log.d("Auth","null");
return null;
}
}
}
private boolean isRequestWithAccessToken(Response response){
String header = response.request().header("Authorization");
return header != null && header.startsWith("Bearer");
}
@NonNull
private Request newRequestWithAccessToken(@NonNull Request request,@NonNull String access_token){
return request.newBuilder()
.header("Authorization", "Bearer " + access_token)
.build();
}
}