android - 架构组件刷新 LiveData

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

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

@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))
                );

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

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

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

也可以只在结果发生变化时启动结果的详细信息 Activity 并刷新数据,但我也不认为在响应式(Reactive)方法中应该这样做。

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

最佳答案

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

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

关于android - 架构组件刷新 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49907255/

相关文章:

android - 使用加速度计计算速度

Android LiveData/StateFlow 列表项属性更新问题

android - 具有 mutablelivedata 支持属性的观察 livedata 如何知道在从未直接更新时触发观察者?

android - 没有 LiveData 的房间

android - 数据绑定(bind)不适用于选项卡项文本属性

android - View 的效率

android - 以粗体显示文本

java - onActivityResult 拍照时返回空指针异常?

android - ViewModel fragment 在屏幕旋转时重新创建

android - 从 LiveData 获取一个值