我的演讲者看起来如下:
// 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项:
如果再次创建该片段,它将从映射中检索已经存在的演示程序,并从其中重用最后已知的状态。然后我就明白了:
这并不完美,我需要更改逻辑以只发出最后一个已知的状态(屏幕旋转后发生的相同行为)。
我该怎么解决这个问题?
发布于 2017-06-22 11:48:04
不要重用推荐人。这不是它的本意。重用它们可能在今天起作用,但也不能保证它将来也会起作用。
基本上,您只想使用从业务逻辑中检索到的数据,对吗?基本上,您希望使用数据AndroInteractor.loadArticle(article)预装此部分。所以,只需在应用程序启动时调用它,而不是整个演示者。也许您使用一些内存/磁盘缓存库,或者只是在BehaviorSubject内部使用AndroInteractor.loadArticle(article)。它保存了最新的数据(如果有的话)。
因此,您的问题只是“业务逻辑问题”/“数据缓存问题”,而不是真正的“演示者”问题。因此,您应该在业务逻辑层解决这个问题,即AndroInteractor.loadArticle(article),而不是保留整个演示者。
https://stackoverflow.com/questions/44691487
复制相似问题