我没有在我的片段中保存任何上下文,因此我在UI片段中使用setRetainInstance(true)
。谁能告诉我这是否是正确的方法?我们应该在哪里基本上调用setRetainInstance
方法?我的意思是在onCreate
或onActivityCreated
等
答案 0 :(得分:5)
当您查看Reference时,您会看到:
onDestroy() will not be called
(但onDetach()仍然是,因为片段正在从当前活动中分离出来。)onCreate(Bundle) will not be called
因为片段没有被重新创建。onAttach(Activity)
和onActivityCreated(Bundle) will still be called
。此方法用于在配置更改时保留片段。您需要在首次创建的片段中设置此方法。如果您在上面看到在轮换后仍会调用onAttach
或onActivityCreated
,请不要在内部设置该方法,因为您将再次调用它。这毫无用处...!最好的方法是在setRetainInstance
方法中调用onCreate
,因为在更改轮换后,最后一次不会再次调用。
所有这些都取决于您对FragmentActivity
和片段的要求和处理方式。我将用Alex Lockwood的a quote回答:
保留的片段对于跨活动实例传播状态信息(尤其是线程管理)非常有用。例如,片段可以充当线程或 AsyncTask 实例的主机,从而管理其操作。有关详细信息,请参阅此主题的my blog post。
一般情况下,我会将 onConfigurationChanged 与活动类似地对待它...不要仅仅因为你太懒而无法使用它作为一个绑定/正确处理方向更改。 仅在您需要 时使用它。
答案 1 :(得分:5)
我会尝试尽可能简单地说出来。
您的片段可能包含UI元素 - 例如:
private TextView mView
使用onCreateView(LayoutInflater, ViewGroup, Bundle)
类实例,在片段的LayoutInflater
方法中初始化这些UI元素。
但是这个LayoutInflater
实例使用Activity
的上下文来扩充您的资源。因此,如果您的UI小部件存储在您的片段类中,它们会隐式拥有相关活动的Context
- 也就是您通过提交FragmentManager
的事务将其附加到的活动。
现在想象一下配置发生变化(例如屏幕旋转)。 Activity
被破坏并创建一个新的。旧Activity
的上下文通常应该是垃圾回收。但是,您保留的片段实例通过每个存储的UI元素对此上下文保存强引用,因此上下文为{{3就GC而言,不应该被垃圾收集。发生内存泄漏。
这就是保留的实例片段不应该用作UI片段的原因。
请记住 - 即使您不存储对Context
对象的引用,例如private Context context
(这就是您提出的问题),您也可能会泄漏这种情况可能性。