【问题标题】:Architecture Components refresh LiveData架构组件刷新 LiveData
【发布时间】:2019-05-10 13:56:46
【问题描述】:

我正在努力使用架构组件在主从视图上刷新数据的正确方法。我有一个单顶主活动,显示最喜欢的电影列表。当我转到详细信息视图时,从收藏夹中添加/删除电影并关闭主视图的详细信息视图,数据保持不同步。我在 onCreate 方法中初始化视图模型:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
   moviesViewModel = ViewModelProviders
                    .of(this, viewModelFactory)
                    .get(MoviesViewModel.class);
   moviesViewModel.getMovies(FAVOURITES).observe(this, this::show);
}

View Model 也很简单:

@NonNull
LiveData<Resource<List<Movie>>> getMovies(Criterion criterion) {
   movieRepository.fetchBy(criterion)
                .doOnSubscribe(it -> moviesLiveData.setValue(Resource.loading()))
                .subscribe(
                        movies -> moviesLiveData.setValue(Resource.success(movies)),
                        throwable -> moviesLiveData.setValue(Resource.error(throwable))
                );

最简单的解决方案是每次激活时强制刷新视图:

@Override
public void onResume() {
   super.onResume();
   moviesViewModel.getMovies(FAVOURITES).observe(this, this::show);
}

但我不太喜欢这种方法,因为它会在屏幕方向发生变化以及活动来自后台时导致刷新。

也可以仅在结果发生更改时启动结果的详细信息活动并刷新数据,但我也不认为在反应式方法中应该这样做。

此外,我正在考虑订阅 cotent 解析器中的数据库更改,并在每次数据更改时使用新内容更新 Flowable,但我确信它是否会起作用,因为当它发生更改时,实时数据观察者(主视图) 处于暂停模式,因此不会收到通知,对吗?

【问题讨论】:

  • 查看SingleLiveEvent。如果您使用它并旋转设备,则不会发生触发器。
  • 如果您将应用置于后台并将应用置于前台 N 次,您的方法将创建 N 个注册。

标签: android android-livedata android-viewmodel android-architecture-components


【解决方案1】:

有几种方法可以管理刷新主视图。

  1. 您可以在这种情况下使用共享 ViewModel。如果主视图和详细视图都是片段,您所要做的就是使用相同的视图模型,将活动或包含片段作为范围传递,例如ViewModelProviders.of(parentFragment!!, viewModelFactory)。然后您的moviesLiveData 可以被主页面和详细页面观察到。 **请注意,最新版本的 Navigation 允许您通过将 ViewModel 绑定到特定的导航图来更精细地定义范围。
  2. 如果您在页面中使用活动,您可以通过详细屏幕中的startActivityForResultsetResult 将电影结果信息传递回母版页,并检索onActivityResult 中的信息
  3. 您可以将网络请求的结果缓存在视图模型之外的其他位置。通常,您可能有一个 Singleton 存储库来检索您的数据。您可以按照与 ViewModel 相同的模式使用 LiveData
  4. 您也可以按照您的建议观察您的数据库。不用担心它处于暂停模式!这就是LiveData 的意义所在,它会存储最新的更新,并在发现时再次发送。

【讨论】:

    【解决方案2】:

    您也可以将 livedata 用于数据库,以便从 db -> vm -> ui 更新更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 2018-10-21
      • 1970-01-01
      • 2020-03-16
      相关资源
      最近更新 更多