我有一个父片段,它包含一个子片段,并且为了调试的目的记录了片段的onAttach
和onCreateView
方法。
当我以这种方式将父片段添加到活动时:
parent.setRetainInstance(false);
旋转后的输出如下:
07-08 20:10:52.295: E/TAG(14216): Parent's onAttach called!
07-08 20:10:52.295: E/TAG(14216): Parent's onCreateView called!
07-08 20:10:52.305: E/TAG(14216): Child's onAttach called!
07-08 20:10:52.305: E/TAG(14216): Child's onCreateView called!
但保留:
parent.setRetainInstance(true);
输出(旋转后)如下:
07-08 20:10:55.395: E/TAG(14216): Parent's onAttach called!
07-08 20:10:55.395: E/TAG(14216): Parent's onCreateView called!
07-08 20:10:55.400: E/TAG(14216): Child's onCreateView called!
总而言之,如果父片段是一个保留的片段,子片段的
onAttach
方法将不会被调用(我假设两者都不是onDetach
)。这个场景只是一个演示,实际上我不得不调试一个复杂的应用程序来找出导致失败的原因。应用程序有内存问题,因为在方向更改之后,子片段泄漏了先前的活动(作为在onattach中设置的侦听器)。如果有人有同样的问题,解决方法可以是从父片段的
onAttach
中手动调用子片段的onAttach
。问题是:这是虫子吗?
最佳答案
当您执行setRetainInstance(true)时,片段将保留其配置(并因此保留对嵌套片段的引用,该片段从未真正分离/附加)。例如,在配置更改(如旋转)过程中可能会发生这种情况。
所以这不是一个bug,是android设计的。
为了回答您的问题,您可以将活动/侦听器引用保留为weakreference,以便在不再需要时将其释放。
另一方面,我会重新考虑整个想法,似乎你应该在这里有一个观察者模式(在onstop/onpause或类似的过程中订阅/取消订阅监听者/观察者)。
注意:这并不能让它变得更好,我讨厌android的生命周期方法