我已经为Android编程了一段时间,我仍在寻找保留数据而不是配置更改的解决方案。除了将Parcelable
保存到活动Bundle
onSaveInstanceState
文档中,建议使用Fragment
并将setRetainInstance
标记设置为true。
但我刚刚遇到一些使用onRetainCustomNonConfigurationInstance
来保存任意对象的代码(以一种奇特的方式,但基本上是大对象而没有引用Activity
等)。我从未见过这种方法,所以我有些疑惑:
onRetainNonConfigurationInstance()
有何不同,Object
也应该返回AsyncTask
,并且本质上应该类似地工作?作为奖励,我将非常感谢保存Observable
,expect(Project.all).not_to include project
,观看主持人等对象状态的任何其他提示或解决方案
答案 0 :(得分:17)
这种方法是否可以安全地调用存储任意对象(从某种意义上说) 我可以肯定它会被召唤,并且它不会成功 不久就弃用/删除了)?
onRetainCustomNonConfigurationInstance()
是一种相对较新的方法,不会弃用。我真的认为它不会很快消失,因为没有理由引入新的东西来删除它。你可以安全地使用它。
此方法与onRetainNonConfigurationInstance()有何不同, 哪个也应该返回Object,实质上应该同样工作?
onRetainNonConfigurationInstance()
总是返回内部NonConfigurationInstances
类的实例,其中包含保留的片段,加载器等状态。您不能(也不应该)更改此系统行为。这就是为什么该方法为final
并且您无法覆盖它的原因。
如果要保留自定义实例,则需要覆盖onRetainCustomNonConfigurationInstance()
并从那里返回。
事实上,onRetainNonConfigurationInstance()
调用onRetainCustomNonConfigurationInstance()
并保留与其他状态(如保留的片段和加载器)重新调整的实例。
由于某种原因,使用保留片段仍然更好吗?
这是您的用例和偏好的问题。逻辑可能是这样的。如果您的活动只是控制片段并且没有其他特殊逻辑,那么使用保留片段会更容易。如果您的活动有某些内容需要保留,那么您可以安全地使用onRetainCustomNonConfigurationInstance()
方法。至于现在,在这两种情况下,状态仍然由良好的旧onRetainNonConfigurationInstance()
方法保留。
P.S。关于存储状态的奖金问题,我宁愿建议查看onSaveInstanceState()方法。它用于存储状态。
更新: AndroidX release from November 5, 2018不赞成使用以下注释方法: onRetainCustomNonConfigurationInstance 已弃用。使用 ViewModel 存储需要在配置更改后存活的对象。