gpt4 book ai didi

android - Mosby MVI - 如何重用 Presenter

转载 作者:行者123 更新时间:2023-11-29 19:12:46 25 4
gpt4 key购买 nike

我的演示者如下所示:

// 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);
}

我的 fragment 的 loadArticleIntent 如下所示:

@Override
public Observable<Article> loadArticleIntent()
{
return Observable.just(article).doOnComplete(() -> L.d("Article loaded"));
}

结果

如果 fragment 是第一次创建,我会得到以下 3 项:

  1. 初始事件
  2. 加载文章事件
  3. 加载的文章或错误事件

如果再次创建 fragment ,它将从 map 中检索已经存在的展示者,并将重用其中的最后一个已知状态。然后我得到以下信息:

  1. 最后加载的事件
  2. 初始事件
  3. 加载文章事件
  4. 加载的文章或错误事件

这并不完美,我需要更改逻辑以仅发出最后已知的状态(与屏幕旋转后发生的行为相同)。

我该如何解决这个问题?

最佳答案

不要重复使用 Presenter。这不是它想要的方式。重用它们在今天可能会奏效,但不能保证它在未来也能奏效。

所以基本上您只想使用从业务逻辑中检索到的数据,对吗?基本上,您希望这部分预加载数据 AndroInteractor.loadArticle(article)。所以只需在应用程序启动时调用它,而不是整个演示者。也许您使用了一些内存/磁盘缓存库,或者只是在 AndroInteractor.loadArticle(article) 内部使用了一个 BehaviorSubject。那一个保存最新数据(如果有的话)。

所以你的问题只是一个“业务逻辑问题”/“数据缓存问题”而不是一个真正的“Presenter”问题。因此,您应该在业务逻辑层解决这个问题,即 AndroInteractor.loadArticle(article) 而不是保留整个 Presenter。

关于android - Mosby MVI - 如何重用 Presenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44691487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com