Q:

Как правильно послать запрос на обновление access_token android?

У меня в приложении есть форма логина, данные с этой формы отправляются на сервер, и если ответ сервера удовлетворительный то я получаю два токена: access и refresh. Access токен используется для доступа к информации, пользоваться этим токеном я могу пока он не протухнет (пол часа), дальше как только токен уже не работает я должен послать запрос на обновление этого токена с использованием refresh_token. Принцип действий я так понял довольно простой, сначала делаем в интерфейсе запрос post в теле которого мы отправляем рефреш токен, и в ответе с сервера по логике должен прийти новый свежий access_token. Вот я написал запрос в интерфейсе, этот адрес я использую при логине и наверное будет правильно на к нему обращаться для получения нового токена:
Call<GetToken> getNewToken (@Body AccessToken body);

Дальше мне нужно создать два класса - запрос и ответ, в классе-запросе мы посылаем рефреш токен на сервер, а в классе-ответе мы пытаемся вытащить токен из ответа сервера. Я сохраняю два токена при логине в sharedpreferences, и соответственно мне нужно вытащить рефреш токен в классе запросе, что-бы его отправить на сервер. Вот мой класс-запрос AccessToken:
public class AccessToken {
    SharedPreferences refresh_pref;
    SharedPreferences.Editor editor;
    final String REFRESH_TOKEN = "refresh_token";
    private String refresh_token;

    public String getREFRESH_TOKEN() {
         // здесь нужно как-то вытащить при помощи sharespreferences refresh_token
        return refresh_token;
    }

}

и вот мой класс-ответ GetToken:
public class GetToken {
    private String access_token, refresh_token,expires_in;

    public GetToken(String access_token, String refresh_token, String expires_in) {
        this.access_token = access_token;
        this.refresh_token = refresh_token;
        this.expires_in = expires_in;
    }

    public String getAccess_token() {
        return access_token;
    }

    public String getRefresh_token() {
        return refresh_token;
    }

    public String getExpires_in() {
        return expires_in;
    }
}

эти классы я еще не полностью доделал, например в классе-запросе я не могу понять как вытащить с настроек рефреш токен, ведь я насколько понял для получения настроек нужна активити, а у меня класс просто, без активити.
Но вот например, я в итоге смогу послать запрос и получить новый access_token с сервера, но мне не очень понятно когда именно посылать этот запрос. Если токен помирает через пол часа то по логике нужно отсылать запрос каждые пол часа, но тогда пользователь будет недоволен задержкой в работе приложения, то есть соответственно нужно отсылать раньше например на 29 минуте, но откуда его посылать??? Я уже думаю может использовать время истечения токена, и путем несложных манипуляций с кодом сравнивать это время с временем на телефоне. Возможно я очень путано объяснил, но я все-таки буду очень благодарен за ценные советы и информацию касательно моего вопроса. Заранее спасибо за помощь.

A:

Есть два пути:

Считаете время жизни токена и заблаговременно (или вовремя) его обновляете. Заблаговременно удобно, что не нужно думать об очереди запросов в ожидании нового токена.
В случае "протухшего" токена сервер вернет определенный вид ошибки. По ней определяем что пора токен обновить. Все запросы данных ставим в очередь и ждем новый токен. Как придет, повторяем последний запрос и освобождаем очередь.

Вкратце так.

