【发布时间】: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