Android片段保留数据

时间:2012-08-07 20:13:37

标签: android rotation android-fragments retain parcelable

如果一个片段的活动经历了像旋转一样的onCreate / Destroy循环,那么最好如何保留Fragment中的数据?

在我们的设置中,我们有可能从我们的服务器加载到片段自定义列表适配器中的大型列表,我们希望通过不使它们在轮换时重新加载来平滑UX。我们设置片段的问题retainInstance = true;是我们的适配器具有对原始活动的上下文的引用,因此会泄漏内存。我们可以只将数据存储在片段中并重新创建适配器;如果那样真的是正确的做法吗?

下一个想法是将数据存储到会话单例对象中并在轮换后检索,这会产生一些陈旧数据的问题,但我们可以轻松克服。

我看到的另一种选择,似乎是最好的解决方案,就是将数据保存到一个包中并在旋转后恢复到新的片段;但是,我们有很多对象需要存储在整个应用程序中,而且我们的一些对象很复杂,包含列表,多种类型,并且可能会让人感到痛苦。是否有更好的解决方案,还是我们必须咬紧牙关让它们成为Parcelable?

3 个答案:

答案 0 :(得分:4)

只是阻止Activity在旋转(等)时重新创建。添加

android:configChanges="keyboardHidden|orientation|screenSize"

到AndroidManifest.xml中的Activity定义。然后就不需要在旋转时保存任何东西了。

修改

如果您不喜欢该解决方案,那么您别无选择,只能使用onSaveInstanceState机制。如果您有复杂的数据,只需将您的类序列化,然后将它们添加到Bundle中。

答案 1 :(得分:1)

设置

  

机器人:configChanges

Android清单中的

属性是禁用默认销毁和重新创建行为的最麻烦且最广泛滥用的解决方法。

了解更多相关信息

使用碎片处理配置更改

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

答案 2 :(得分:0)

根据http://developer.android.com/guide/topics/resources/runtime-changes.html,you完全可以保存片段中的数据,只要它不与活动,视图等相关联。捆绑包实际上不适用于大量数据,并且序列化很慢,所以片段是大量数据的理想选择。

  

您可能无法通过onSaveInstanceState()回调系统为您保存的Bundle完全恢复您的活动状态 - 它不是为了携带大型对象(如位图)及其中的数据而设计的必须序列化然后反序列化,这会占用大量内存并使配置变化缓慢。在这种情况下,您可以通过在配置更改时重新启动活动时保留Fragment来减轻重新初始化活动的负担。此片段可以包含对要保留的有状态对象的引用。