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