为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例? [英] Why does ViewModelProvider creates new instance of view model on screen rotation?

查看:36
本文介绍了为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现分页,但每次我旋转视图模型的屏幕构造函数时都会被调用,从而触发 loadInitial 以从我的 DataSource 类中的网络获取新数据.感谢帮助

Im trying to implement Paging but every time i rotate a screen constructor of view model gets called, thus triggering loadInitial to fetch new data from network in my DataSource class.Help appreciated

// ViewModel
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"

在我的 oncreate 活动中:

In my activity oncreate:

TopRatedResultViewModel viewModel =   ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(TopRatedResultViewModel.class);

查看模型:

public class TopRatedResultViewModel extends AndroidViewModel {
private Top_Rated_Results_Repository repository;

public TopRatedResultViewModel(@NonNull Application application) {
    super(application);
    Log.d("moviedatabaselog", "TopRatedResultViewModel ");
    repository = new Top_Rated_Results_Repository(application);

}

public LiveData<PagedList<Top_Rated_Result>> getTopRatedResultsPagedList() {
    return repository.getTopRatedResultsPagedList();
}

我正在学习本教程Android 分页改造但是这里使用了不推荐使用的 ViewModelProviders.of 并且当我在屏幕旋转构造函数没有被调用之后测试它时.

I was following this tutorial Android paging with retrofit but here deprecated ViewModelProviders.of is used and when i test it after screen rotation constructor dont get called.

推荐答案

您永远不应该自己调用工厂的 create() 方法 - 这将忽略任何先前创建的 ViewModel 并始终创建一个新实例,而不是只创建一个实例并在每次检索实例时重复使用它.

You should never be calling through to the factory's create() method yourself - this will ignore any previously created ViewModel and always create a new instance rather than only creating one instance and reusing it every time you retrieve the instance.

相反,您应该遵循文档并使用ViewModelProvider:

Instead, you should be following the documentation and using ViewModelProvider:

// By passing in your Activity/Fragment as the ViewModelStoreOwner
// ViewModelProvider is able to retrieve already existing ViewModels
// Rather than create a new one each time
ViewModelProvider viewModelProvider = new ViewModelProvider(this);

// Then you call get() on your ViewModelProvider to get the instance,
// only creating one if one doesn't already exist
TopRatedResultViewModel viewModel = viewModelProvider.get(TopRatedResultViewModel.class);

这篇关于为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆