Здравствуйте.
Не очень сильно знаком с потоками, проблема заключается в обновлении токена авторизации при истечении срока их службы.
При вызове getPosts() response возвращает 403, т.е есть необходимость в обновлении токена и переходит в subscribe( error -> {}) где вызывается статический метод Helper.refreshToken() который в свою очередь также имеет свой Observable но на subscribe сразу переходит к завершению(без сохранения токенов в PreferenceUtils) дожидаясь выполнения главного потока, у которого на очереди идет заселение listView елементами которым необходим свежий accessToken.
Только после неудачного завершения getPosts поток переключается на сохранение токенов, которые в тот момент уже не так необходимы. Как можно реализовать последовательное выполнение действий без ожидания завершения главного потока т.е сначала занести токены в PreferenceUtils, а уже потом getPosts()
service.getPosts(offset,limit, PreferencesUtils.getAccessTokenKey())
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(response -> {
if (!response.isSuccessful()) throw new RuntimeException();
})
.subscribe(
feeds -> mView.showNewsFeedItems(feeds.body()),
error -> {
Helper.refreshToken();//здесь идет выполнение обновления токенов,
который на выполнении subscribe переходит в режим ожидания завершения работы главного потока
и сразу идет к выполнению -- service.getPosts ниже PreferenceUtils.getAccessTokenKey() которого
все еще не актуален
service.getPosts(offset,limit,PreferencesUtils.getAccessTokenKey());
// после переключается на поток который в очереди на выполнение,
тоесть к PreferencesUtils.saveAccessToken(который по сути уже не нужен)
}
);
Helper class
public static void refreshToken() {
service.refreshToken(PreferencesUtils.getAccessTokenKey(), PreferencesUtils.getRefreshTokenKey())
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.newThread())
.subscribe(
response -> { // -----X
PreferencesUtils.saveAccessToken(response.body().getAccessToken());
PreferencesUtils.saveRefreshToken(response.body().getRefreshToken());
},
error -> Log.d(TAG, "refresh token exception: " + error.getMessage())
); // <--- сразу завершает без выполнения onNext
}
public interface HelperService {
@FormUrlEncoded
@POST("api")
Observable<Response<User>> refreshToken(@Field("accessToken") String accessToken,
@Field("refreshToken") String refreshToken);
}
Как можно исправить такое поведение или использовать другой подход к обновлению токенов авторизации. Спасибо!
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть активность CartActivity, в котором расположен RecyclerViewТак же есть класс RecyclerViewAdapter
В уроках об FXML говорится об пользе и преимуществах разделения интерфейса и логики в программах, но есть ещё непонятный мне класс "Controller" (помимо...
Вопрос следующийЕсть некое приложение, в методе main оно выполняет действия, по ходу работы всю информацию логгирует и записывает в файл