Проблема с потоками Android RxJava

202
06 апреля 2018, 19:26

Здравствуйте.

Не очень сильно знаком с потоками, проблема заключается в обновлении токена авторизации при истечении срока их службы.

При вызове 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);
}

Как можно исправить такое поведение или использовать другой подход к обновлению токенов авторизации. Спасибо!

READ ALSO
Как обновить TextView при изменении в RecyclerView?

Как обновить TextView при изменении в RecyclerView?

Есть активность CartActivity, в котором расположен RecyclerViewТак же есть класс RecyclerViewAdapter

236
JavaFX FXML, для чего Controller?

JavaFX FXML, для чего Controller?

В уроках об FXML говорится об пользе и преимуществах разделения интерфейса и логики в программах, но есть ещё непонятный мне класс "Controller" (помимо...

216
Удалить папку с root правами

Удалить папку с root правами

Как удалить папку например /data/data/comandroid

218
Автоматизация запуска main метода

Автоматизация запуска main метода

Вопрос следующийЕсть некое приложение, в методе main оно выполняет действия, по ходу работы всю информацию логгирует и записывает в файл

163