setRetainInstance(true)在android中的onCreate片段中

时间:2014-01-18 12:14:27

标签: android android-fragments

我没有在我的片段中保存任何上下文,因此我在UI片段中使用setRetainInstance(true)。谁能告诉我这是否是正确的方法?我们应该在哪里基本上调用setRetainInstance方法?我的意思是在onCreateonActivityCreated

2 个答案:

答案 0 :(得分:5)

简介:setRetainInstance(boolean)

当您查看Reference时,您会看到:

  • onDestroy() will not be called(但onDetach()仍然是,因为片段正在从当前活动中分离出来。)
  • onCreate(Bundle) will not be called因为片段没有被重新创建。
  • onAttach(Activity)onActivityCreated(Bundle) will still be called

那么,我应该在哪里使用这种方法?

此方法用于在配置更改时保留片段。您需要在首次创建的片段中设置此方法。如果您在上面看到在轮换后仍会调用onAttachonActivityCreated,请不要在内部设置该方法,因为您将再次调用它。这毫无用处...!最好的方法是在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(这就是您提出的问题),您也可能会泄漏这种情况可能性。