我指的是Why use Fragment#setRetainInstance(boolean)?
我之所以要求Activity
处理轮换,Official Activity Documentation鼓励我们让Activity
在轮换期间关闭并重启。
android:configChanges列出活动的配置更改 将处理自己。当运行时发生配置更改时, 默认情况下,活动已关闭并重新启动,但声明了一个 具有此属性的配置将阻止活动 重新启动。相反,活动仍然在运行 调用onConfigurationChanged()方法。注意:使用此属性 应避免使用,仅作为最后手段使用。请阅读处理 运行时更改有关如何正确处理的更多信息 由于配置更改而重新启动。
任何尝试更改此活动默认行为似乎都是不好的做法。为避免Activity在重新启动期间重新加载耗时的数据结构,我们会使用onRetainNonConfigurationInstance
和getLastNonConfigurationInstance
。 - Official Handling Runtime Changes
然而,当在Fragment中处理轮换时,谷歌会给我们不同的推荐吗?他们不希望我们关闭并重新启动Fragment?
public Object onRetainNonConfigurationInstance ()
此方法在API级别13中已弃用。请使用新的Fragment API 改为setRetainInstance(boolean);这也适用于老年人 平台通过Android兼容包。
setRetainInstance(true)
善于处理轮换,为什么Google不将其作为Fragment的默认行为?答案 0 :(得分:32)
配置更改:当突然屏幕变得更宽,高度更低(典型景观)时,可视组件更新其显示更加智能地使用可用屏幕。配置更改的另一个示例是用户滑动硬件键盘,设备语言更改等。为什么重新开始:
Android组件支持声明性布局,您可以加载一堆XML布局,并从那里开始工作。查找每个视图并实时重新安排/更新它将是一团糟,更不用说重新连接所有事件处理程序和其他自定义View代码。它更容易重新加载另一堆布局文件。
此外,在Android中,活动类似于系统的生活,所以自然地,活动生命周期被设计(并推荐),它能够随时随地重新创建自己,只是就像它被摧毁之前一样。此模式适用于所有重新启动,也适用于配置更改。如果您使您的活动和碎片能够保持永恒状态,配置更改将不会是一个大问题。
保留状态数据(模型),而不是显示它的内容(UI和视图)。
setRetainInstance(true):建议仅与不包含任何引用的片段一起使用,这些片段将在轮播时重新创建。这意味着你不应该在任何包含Context,Views等的Fragment上使用它。典型的Visual片段可以。但是对于包含运行Threads,AsyncTasks,Data Collections,加载资源,获取结果等对象的Fragments来说非常有用。这种方法有助于为Activity的非Context依赖对象使用非可视Fragment作为可拆卸的holder。
答案 1 :(得分:4)
因为你误解了它的用法。 setRetainInstance(true)
只应用于与独奏元素/模块类似的片段中。处理套接字等的片段没有GUI真正受益于保留。具有GUI的片段可能不应使用setRetainInstance(true)
。此外,任何进入Backstack的片段都不应使用setRetainIstance(true)
。
您可以将其概括为任何仅处理数据/连接等的片段,并使用setRetainInstance(true)
。但是有许多不同的方法可以使用片段,这些方法不会使setRetainInstance(true)
受益。