ViewModelProvider
是 Android Jetpack 中的一个类,用于管理和提供 ViewModel
实例。当设备的配置发生变化(例如屏幕方向、语言或资源变化)时,使用 ViewModelProvider
可以确保您的应用正确地处理这些变化。
以下是处理配置变化时使用 ViewModelProvider
的步骤:
- 在您的
Activity
或Fragment
中,首先获取一个ViewModelProvider
实例:
val viewModelProvider = ViewModelProvider(this)
- 使用
viewModelProvider.get()
方法获取您需要的ViewModel
实例。这将返回一个已创建的ViewModel
(如果已经存在)或创建一个新的ViewModel
(如果不存在):
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
- 为了在配置变化时保持
ViewModel
数据,您需要确保ViewModel
类继承自AndroidViewModel
。AndroidViewModel
是ViewModel
的子类,它接收一个Application
实例作为参数,并在其构造函数中调用super(application)
。这使得AndroidViewModel
能够访问应用程序的生命周期,从而在配置变化时保持数据:
import androidx.lifecycle.AndroidViewModel class MyViewModel(application: Application) : AndroidViewModel(application) { // ... }
- 在
Activity
或Fragment
的生命周期方法中(例如onSaveInstanceState()
和onCreate()
),使用ViewModelProvider
获取或重新创建ViewModel
实例。这将确保在配置变化时始终使用最新的ViewModel
实例:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val viewModelProvider = ViewModelProvider(this)
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
outState.putParcelable("my_view_model", myViewModel)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState != null) {
val viewModelProvider = ViewModelProvider(this)
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
// 使用已保存的 ViewModel 实例
} else {
val viewModelProvider = ViewModelProvider(this)
val myViewModel = viewModelProvider.get(MyViewModel::class.java)
// 创建新的 ViewModel 实例
}
}
通过遵循这些步骤,您可以确保在设备配置发生变化时,使用 ViewModelProvider
管理的 ViewModel
能够正确地保持和处理数据。