ViewModel剖析:onSavedInstanceState与onRetainNonConfigurationInstance的区别
2023-10-15 09:44:23
ViewModel 的救命秘籍:掌握 onSaveInstanceState 和 onRetainNonConfigurationInstance
在 Android 开发中,ViewModel 扮演着至关重要的角色,它帮助我们管理数据,避免配置更改带来的数据丢失问题。本文将深入剖析 ViewModel 中的两个关键方法:onSaveInstanceState
和 onRetainNonConfigurationInstance
,带你了解它们之间的区别,掌握最佳实践,让你的 Android 应用程序更加健壮可靠。
配置更改:数据丢失的罪魁祸首
当 Android 设备的屏幕方向或其他配置发生变化时,系统将销毁当前 Activity 并重新创建它。此过程称为配置更改,它可能导致数据丢失。为了解决这个问题,Android 提供了两种方法:onSaveInstanceState
和 onRetainNonConfigurationInstance
。
onSaveInstanceState:保存基本数据
onSaveInstanceState
方法在 Activity 销毁之前调用,它允许你保存可序列化数据的键值对。这些数据将在重建 Activity 时通过 onRestoreInstanceState
方法恢复。
使用 onSaveInstanceState
,你可以保存基本数据类型,例如 int、float、long 等,以及字符串和实现 Parcelable 接口的对象。但是,切记不要保存不可序列化的对象,如 View 或 Bitmap,否则会引发错误。
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("score", score)
outState.putString("name", name)
}
onRetainNonConfigurationInstance:保留轻量级对象
onRetainNonConfigurationInstance
方法也在 Activity 销毁之前调用,但它与 onSaveInstanceState
不同。它返回一个对象,该对象在重建 Activity 后将通过 getLastNonConfigurationInstance()
方法获取。
使用 onRetainNonConfigurationInstance
,你可以返回一个轻量级的对象,该对象在配置更改期间会被保留。避免保存对 Activity 或 View 的引用,因为这些引用在重建后将无效。只保存重建 Activity 所必需的数据,避免存储过多信息。
override fun onRetainNonConfigurationInstance(): Any {
return scorekeeper
}
区别与最佳实践:明智选择
onSaveInstanceState
和 onRetainNonConfigurationInstance
的主要区别在于:
- 保存的数据类型:
onSaveInstanceState
保存键值对,而onRetainNonConfigurationInstance
返回一个对象。 - 对象保留时间:
onSaveInstanceState
保存的数据在配置更改期间将被销毁,而onRetainNonConfigurationInstance
返回的对象将被保留。
一般来说,最佳实践建议优先使用 ViewModel,因为它无需手动保存或恢复数据。仅在需要保存基本数据类型时使用 onSaveInstanceState
。尽量避免使用 onRetainNonConfigurationInstance
,因为它可能会导致内存泄漏和其他问题。
常见问题解答
-
什么时候应该使用 ViewModel?
- 始终优先使用 ViewModel 来管理数据,因为它无需手动保存或恢复数据,并且可以跨 Activity 和 Fragment 共享。
-
什么时候应该使用 onSaveInstanceState?
- 仅在需要保存基本数据类型时使用
onSaveInstanceState
。避免保存不可序列化的对象或对 Activity 或 View 的引用。
- 仅在需要保存基本数据类型时使用
-
什么时候应该使用 onRetainNonConfigurationInstance?
- 尽量避免使用
onRetainNonConfigurationInstance
。如果必须使用,请返回一个轻量级的对象,避免保存对 Activity 或 View 的引用。
- 尽量避免使用
-
如何恢复 onSaveInstanceState 中保存的数据?
- 在
onRestoreInstanceState
方法中使用get()
方法从 Bundle 中恢复数据。
- 在
-
如何访问 onRetainNonConfigurationInstance 返回的对象?
- 在重建的 Activity 中使用
getLastNonConfigurationInstance()
方法获取对象。
- 在重建的 Activity 中使用
总结:保障数据安全
理解 onSaveInstanceState
和 onRetainNonConfigurationInstance
对于有效管理配置更改至关重要。优先使用 ViewModel,谨慎使用 onSaveInstanceState
,避免使用 onRetainNonConfigurationInstance
,遵循这些最佳实践,你将避免数据丢失问题,打造健壮可靠的 Android 应用程序。