使用`onRetainCustomNonConfigurationInstance`来保留跨配置更改的数据

时间:2015-06-05 18:23:03

标签: android android-activity android-fragmentactivity android-framework

我已经为Android编程了一段时间,我仍在寻找保留数据而不是配置更改的解决方案。除了将Parcelable保存到活动Bundle onSaveInstanceState文档中,建议使用Fragment并将setRetainInstance标记设置为true。

但我刚刚遇到一些使用onRetainCustomNonConfigurationInstance来保存任意对象的代码(以一种奇特的方式,但基本上是大对象而没有引用Activity等)。我从未见过这种方法,所以我有些疑惑:

  • 这种方法是否可以安全地调用存储任意对象(从某种意义上说,我可以肯定它会被调用,并且它很快就会被弃用/删除)?
  • 此方法与onRetainNonConfigurationInstance()有何不同,Object也应该返回AsyncTask,并且本质上应该类似地工作?
  • 由于某种原因,使用保留片段仍然更好吗?

作为奖励,我将非常感谢保存Observableexpect(Project.all).not_to include project ,观看主持人等对象状态的任何其他提示或解决方案

1 个答案:

答案 0 :(得分:17)

  

这种方法是否可以安全地调用存储任意对象(从某种意义上说)   我可以肯定它会被召唤,并且它不会成功   不久就弃用/删除了)?

onRetainCustomNonConfigurationInstance()是一种相对较新的方法,不会弃用。我真的认为它不会很快消失,因为没有理由引入新的东西来删除它。你可以安全地使用它。

  

此方法与onRetainNonConfigurationInstance()有何不同,   哪个也应该返回Object,实质上应该同样工作?

onRetainNonConfigurationInstance()总是返回内部NonConfigurationInstances类的实例,其中包含保留的片段,加载器等状态。您不能(也不应该)更改此系统行为。这就是为什么该方法为final并且您无法覆盖它的原因。

如果要保留自定义实例,则需要覆盖onRetainCustomNonConfigurationInstance()并从那里返回。

事实上,onRetainNonConfigurationInstance()调用onRetainCustomNonConfigurationInstance()并保留与其他状态(如保留的片段和加载器)重新调整的实例。

  

由于某种原因,使用保留片段仍然更好吗?

这是您的用例和偏好的问题。逻辑可能是这样的。如果您的活动只是控制片段并且没有其他特殊逻辑,那么使用保留片段会更容易。如果您的活动有某些内容需要保留,那么您可以安全地使用onRetainCustomNonConfigurationInstance()方法。至于现在,在这两种情况下,状态仍然由良好的旧onRetainNonConfigurationInstance()方法保留。

P.S。关于存储状态的奖金问题,我宁愿建议查看onSaveInstanceState()方法。它用于存储状态。

更新: AndroidX release from November 5, 2018不赞成使用以下注释方法: onRetainCustomNonConfigurationInstance 已弃用。使用 ViewModel 存储需要在配置更改后存活的对象。