当片段的活动经历onCreate/Destroy循环时,如何最好地保留片段中的数据?
在我们的设置中,我们有可能很大的列表从我们的服务器加载到片段自定义列表适配器中,我们希望通过不让它们在轮换时重新加载来平滑UX。我们在设置片段retainInstance=true时遇到的问题是,我们的适配器引用了原始活动的上下文,因此会泄漏内存。我们是否可以将数据存储在片段中并重新创建适配器;如果是这样,这真的是正确的做法吗?
下一个想法是将数据存储到一个会话单例对象中,并在轮换后检索,这会给陈旧的数据带来一些问题,但我们可以很容易地克服。
我看到的另一种选择,似乎是*最好的解决方案,是将数据保存到捆绑包中,并在旋转后恢复到新的片段中;然而,我们有相当多的对象需要存储在整个应用程序中,并且我们的一些对象很复杂,包含列表,多种类型,并且使其成为可打包的对象将是一件痛苦的事情。有没有更好的解决方案,或者我们必须咬紧牙关让它们变得可打包?
发布于 2012-08-07 20:17:44
只需防止活动在循环中重新创建(等)。添加
android:configChanges="keyboardHidden|orientation|screenSize"
添加到AndroidManifest.xml中的活动定义中。这样就不需要在旋转时保存任何内容了。
编辑:
如果您不喜欢该解决方案,那么您别无选择,只能使用onSaveInstanceState机制。如果你有复杂的数据,只需使你的类可序列化,并以这种方式将它们添加到Bundle中。
发布于 2014-09-12 13:15:31
设置
安卓:configChanges
属性是禁用默认销毁和重新创建行为的最黑客和最广泛滥用的解决方法。
有关更多信息,请参阅
使用片段处理配置更改的:
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
发布于 2016-03-14 01:25:49
根据http://developer.android.com/guide/topics/resources/runtime-changes.html,you的说法,完全可以将数据保存在片段中,只要它不与活动、视图等相关联。捆绑包真的不是用于大量数据的,并且序列化很慢,所以片段是大量数据的理想选择。
您可能无法使用系统通过onSaveInstanceState()回调为您保存的捆绑包完全恢复您的活动状态-它不是为携带大型对象(如位图)而设计的,其中的数据必须被序列化然后反序列化,这会消耗大量内存并使配置更改变得缓慢。在这种情况下,您可以通过在活动由于配置更改而重新启动时保留片段来减轻重新初始化活动的负担。此片段可以包含对要保留的有状态对象的引用。
https://stackoverflow.com/questions/11853389
复制