5

当一个片段的活动经历一个 onCreate/Destroy 循环时,如何最好地将数据保留在片段中?

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

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

我看到的另一种选择,似乎是*最佳解决方案,是将数据保存到一个包中,并在旋转后恢复到新片段中;但是,我们有相当多的对象需要在整个应用程序中存储,并且我们的一些对象很复杂,包含列表、多种类型,并且很难打包。有没有更好的解决方案,还是我们必须硬着头皮让它们可包裹?

4

3 回答 3

4

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

android:configChanges="keyboardHidden|orientation|screenSize"

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

编辑:

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

于 2012-08-07T20:17:43.723 回答
1

设置

安卓:配置更改

Android 清单中的属性是禁用默认销毁和重新创建行为的最黑客和最广泛滥用的解决方法。

在此处查看更多信息

使用片段处理配置更改

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

于 2014-09-12T13:15:31.230 回答
0

根据http://developer.android.com/guide/topics/resources/runtime-changes.html,只要不与活动、视图等相关联,您完全可以将数据保存在片段中。确实不适用于大量数据并且序列化速度很慢,因此片段非常适合大量数据。

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

于 2016-03-14T01:25:48.803 回答