android中onCreate片段中的setRetainInstance(true)



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

简介:setRetainInstance(布尔值)

当你查看参考资料时,你会看到:

  • onDestroy() will not be called(但onDetach()仍将是,因为片段正在从其当前活动中分离)
  • CCD_ 6,因为片段没有被重新创建
  • 7和CCD_ 8

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

此方法用于在配置更改时保留片段。您需要在第一次创建时在fragment中设置此方法。当您在上面看到onAttachonActivityCreated在旋转后仍将被调用时,不要在内部设置该方法,因为您将再次调用它。没用。。。!最好的方法是在onCreate方法中调用setRetainInstance,因为在改变旋转后,最后一个将不会被再次调用

使用它的正确方法是什么

这一切都取决于你想要什么,以及如何处理你的FragmentActivity和碎片。我将引用Alex Lockwood的一句话来回答:

保留的片段对于跨活动实例传播状态信息(尤其是线程管理)非常有用。例如,片段可以作为ThreadAsyncTask实例的主机,管理其操作。有关详细信息,请参阅我关于此主题的博客文章。

通常,我会将其与使用onConfigurationChangedActivity类似。。。不要因为你太懒而不能正确地实现/处理方向更改,就把它当作创可贴仅在需要时使用

我会尽量简单地说。

您的片段可能包含UI元素,比如:

private TextView mView

这些UI元素在片段的onCreateView(LayoutInflater, ViewGroup, Bundle)方法中使用LayoutInflater类实例进行初始化。

但是这个LayoutInflater实例使用Activity的上下文来膨胀您的资源。因此,如果UI小部件存储在fragment类中,那么它们隐含地拥有关联活动的Context,也就是说,您通过提交FragmentManager的事务将其附加到的活动。

现在想象一下配置发生了变化(例如屏幕旋转)。CCD_ 21被销毁并创建一个新的CCD_。旧Activity上下文通常应该被垃圾回收。但是,您保留的片段实例通过您存储的每个UI元素持有对该上下文强引用,因此该context在GC方面是"可访问的",不应被垃圾收集。发生内存泄漏。

这就是为什么保留的实例片段不应该用作UI片段的原因。

只需记住-即使您不存储Context对象的引用,如private Context context(这是您所要求的),您也可能在很多情况下泄露此上下文。

最新更新