首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mosby MVI -如何重用演示器

Mosby MVI -如何重用演示器
EN

Stack Overflow用户
提问于 2017-06-22 06:13:45
回答 1查看 195关注 0票数 1

我的演讲者看起来如下:

代码语言:javascript
复制
// 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如下所示:

代码语言:javascript
复制
@Override
public Observable<Article> loadArticleIntent()
{
    return Observable.just(article).doOnComplete(() -> L.d("Article loaded"));
}

结果

如果第一次创建该片段,我将得到以下3项:

  1. 初始事件
  2. 加载项目事件
  3. 加载的项目或错误事件

如果再次创建该片段,它将从映射中检索已经存在的演示程序,并从其中重用最后已知的状态。然后我就明白了:

  1. 上次加载的事件
  2. 初始事件
  3. 加载项目事件
  4. 加载的项目或错误事件

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

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-22 11:48:04

不要重用推荐人。这不是它的本意。重用它们可能在今天起作用,但也不能保证它将来也会起作用。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44691487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档