我的片段中没有任何上下文,所以我在UI片段中使用setRetainInstance(true)
。有人能告诉我这是否是正确的方法吗?还有我们基本上应该在哪里调用setRetainInstance
方法?我的意思是在onCreate
或onActivityCreated
等中
简介:setRetainInstance(布尔值)
当你查看参考资料时,你会看到:
onDestroy() will not be called
(但onDetach()仍将是,因为片段正在从其当前活动中分离)- CCD_ 6,因为片段没有被重新创建
- 7和CCD_ 8
那么,我应该在哪里使用这种方法
此方法用于在配置更改时保留片段。您需要在第一次创建时在fragment中设置此方法。当您在上面看到onAttach
或onActivityCreated
在旋转后仍将被调用时,不要在内部设置该方法,因为您将再次调用它。没用。。。!最好的方法是在onCreate
方法中调用setRetainInstance
,因为在改变旋转后,最后一个将不会被再次调用。
使用它的正确方法是什么
这一切都取决于你想要什么,以及如何处理你的FragmentActivity
和碎片。我将引用Alex Lockwood的一句话来回答:
保留的片段对于跨活动实例传播状态信息(尤其是线程管理)非常有用。例如,片段可以作为Thread或AsyncTask实例的主机,管理其操作。有关详细信息,请参阅我关于此主题的博客文章。
通常,我会将其与使用onConfigurationChanged和Activity类似。。。不要因为你太懒而不能正确地实现/处理方向更改,就把它当作创可贴仅在需要时使用。
我会尽量简单地说。
您的片段可能包含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
(这是您所要求的),您也可能在很多情况下泄露此上下文。