Как не вызывать подписку () во второй раз после поворота фрагмента? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть Fragment, который содержит Presenter.

Каждый раз, когда пользователь перемещает приложение в фоновый режим или делает приостановку \ возобновление работы телефона, моя логика в Presenter вызывает автоматически, потому что я отключаю и присоединяю докладчика в onResume() и в onPause() методах, чтобы сделатьВедущий спит, когда пользователь не взаимодействует с экраном.Вопрос в том, можно ли повторно подписаться на Observable, но не звонить телу subscribe() в первый раз?Потому что теперь каждый раз, когда я поворачиваю устройство, я вижу индикатор загрузки, тогда я не хочу его видеть.

Псевдокод:

Фрагмент:

@Override
public void onResume() {
    super.onResume();
    graphPresenter.attach(this);
}

@Override
public void onPause() {
    super.onPause();
    graphPresenter.detach(this);
}

Ведущий:

@Override
protected void onAttach(View view) {

final Observable<Data> dataObservable = 
        dataRepository.getDataIdentifier()
                .switchMap(id -> {

                    //this calls each time on rotation =(

                    view.showDataLoading();
                    return repository.loadData(id);
                });

    dataObservable.subscribe(data -> {
           view.showData(data);
           view.hideDataLoading();
    });
}

Мои данные загружаются не так часто, поэтому я не хочу видеть индикатор загрузки.Просто хочу видеть старые данные сразу после поворота.

PS Я пытался установить setRetainInstance(true), но это не помогло.

1 Ответ

0 голосов
/ 07 июня 2018

Метод setRetainInstance используется для других целей - он используется для сохранения экземпляра фрагмента между воссозданием активности (при изменении конфигурации).

В вашем случае, возможно, лучший способ - создать флаг в презентере, которыйозначает, что данные загружены:

@Override
public void onAttach(View view) {
    if (!isDataLoaded) {
        dataRepository.getData()
                .doOnSubscribe(d -> view.showLoading(true))
                .doAfterTerminate(d -> view.showLoading(false))
                .doOnSuccess(d -> isDataLoaded = true)
                .subscribe(view::showData, Throwable::printStackTrace);
    }
}

Также вы можете вызывать метод attach не в onResume, а в onCreate, как я понимаю, это не приведет к ошибкам.

...