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