Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 架构组件刷新实时数据_Android_Android Livedata_Android Viewmodel_Android Architecture Components - Fatal编程技术网

Android 架构组件刷新实时数据

Android 架构组件刷新实时数据,android,android-livedata,android-viewmodel,android-architecture-components,Android,Android Livedata,Android Viewmodel,Android Architecture Components,我正在努力寻找使用体系结构组件刷新主细节视图上数据的正确方法。我有一个top master活动,显示最喜爱的电影列表。当我转到“详细信息”视图时,从“收藏夹”中添加/删除电影并关闭“详细信息”视图,主视图的数据保持不同步。我在onCreate方法中初始化视图模型: @Override public void onCreate(@Nullable Bundle savedInstanceState) { moviesViewModel = ViewModelProviders

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

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
   moviesViewModel = ViewModelProviders
                    .of(this, viewModelFactory)
                    .get(MoviesViewModel.class);
   moviesViewModel.getMovies(FAVOURITES).observe(this, this::show);
}
视图模型也非常简单:

@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))
                );
但我不太喜欢这种方法,因为当屏幕方向改变时,以及当活动来自后台时,它会导致刷新

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


此外,我曾考虑在Coent解析器中订阅数据库更改,并在每次数据更改时使用新内容更新Flowable,但我确信它是否会工作,因为当发生更改时,live data observer(主视图)处于暂停模式,因此不会通知它,我说的对吗?

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

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

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

  • 查查。如果您使用此方法并旋转设备,则不会发生触发。如果您将应用程序置于后台并将应用程序置于前台N次,您的方法将创建N个注册。
    @Override
    public void onResume() {
       super.onResume();
       moviesViewModel.getMovies(FAVOURITES).observe(this, this::show);
    }