为什么 ViewModelProvider 在屏幕旋转时创建新的视图模型实例?
Why does ViewModelProvider creates new instance of view model on screen rotation?
我试图实现分页,但每次我旋转屏幕时都会调用视图模型的构造函数,从而触发 loadInitial 从我的数据源中的网络获取新数据class.Help 赞赏
// ViewModel
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
在我的 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 paging with retrofit
但是这里使用了弃用的 ViewModelProviders.of 并且当我在屏幕旋转构造函数之后测试它时没有被调用。
您永远不应该自己调用工厂的 create()
方法 - 这将忽略任何以前创建的 ViewModel 并始终创建一个新实例,而不是只创建一个实例并在每次检索实例时重复使用它.
相反,您应该关注 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);
我试图实现分页,但每次我旋转屏幕时都会调用视图模型的构造函数,从而触发 loadInitial 从我的数据源中的网络获取新数据class.Help 赞赏
// ViewModel
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
在我的 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 paging with retrofit 但是这里使用了弃用的 ViewModelProviders.of 并且当我在屏幕旋转构造函数之后测试它时没有被调用。
您永远不应该自己调用工厂的 create()
方法 - 这将忽略任何以前创建的 ViewModel 并始终创建一个新实例,而不是只创建一个实例并在每次检索实例时重复使用它.
相反,您应该关注 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);