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 能够正确地保持和处理数据。