为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例?

Nik*_*doč 1 android android-mvvm android-livedata android-architecture-components

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

// ViewModel
def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)

在我的活动 oncreate 中:

TopRatedResultViewModel viewModel =   ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(TopRatedResultViewModel.class);
Run Code Online (Sandbox Code Playgroud)

查看型号:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

ian*_*ake 6

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

相反,您应该遵循文档并使用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);
Run Code Online (Sandbox Code Playgroud)