Мой ведущий выглядит следующим образом:
// I'm retaining the presenter in a singleton instances map and reuse them
// because they are loading data from the internet and this should be done once
// per app start only
public static ArticlePresenter get(Article article)
{
if (INSTANCES.containsKey(article.id()))
return INSTANCES.get(article.id());
ArticlePresenter instance = new ArticlePresenter();
INSTANCES.put(article.id(), instance);
return instance;
}
@Override
protected void bindIntents()
{
ArrayList<Observable<ArticlePartialStateChanges>> observables = new ArrayList<>();
observables.add(intent(ArticleView::loadArticleIntent)
.doOnNext(article -> L.d("intent: loadArticleIntent"))
.flatMap(article -> AndroInteractor.loadArticle(article)
.map(data -> (ArticlePartialStateChanges) new ArticlePartialStateChanges.Loaded(data))
.startWith(new ArticlePartialStateChanges.LoadingArticle(article))
.onErrorReturn(ArticlePartialStateChanges.LoadingArticleError::new)
.subscribeOn(Schedulers.io())
)
);
Observable<ArticlePartialStateChanges> allIntents = Observable.merge(observables);
ArticleViewState initialState = ArticleViewState.builder().build();
Observable<ArticleViewState> stateObservable = allIntents
.scan(initialState, this::viewStateReducer)
.observeOn(AndroidSchedulers.mainThread());
subscribeViewState(stateObservable, ArticleView::render);
}
И мой фрагмент loadArticleIntent
выглядит следующим образом:
@Override
public Observable<Article> loadArticleIntent()
{
return Observable.just(article).doOnComplete(() -> L.d("Article loaded"));
}
Результат
Если фрагмент создается в первый раз, я получаю следующие 3 элемента:
- Начальное событие
- Событие загрузки статьи
- Загруженная статья или событие ошибки
Если фрагмент будет создан снова, он извлечет из карты уже существующий презентер и повторно использует из него последнее известное состояние. Затем я получаю следующее:
- Последнее загруженное событие
- Начальное событие
- Событие загрузки статьи
- Загруженная статья или событие ошибки
Это не идеально, мне нужно изменить логику, чтобы ТОЛЬКО генерировалось последнее известное состояние (то же самое поведение, которое происходит после поворота экрана).
Как я должен это решить?