首页 文章

onAttach()没有用setRetainInstance(true)调用;

提问于
浏览
3

我有一个包含单个子片段的父片段,并且记录了片段的 onAttachonCreateView 方法以进行调试 .

当我以这种方式将父片段添加到Activity时:

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!

总而言之,如果父片段是保留片段(我不假设 onDetach ),则不会调用子片段的 onAttach 方法 . 这个场景只是一个演示,我实际上不得不调试一个复杂的应用程序来找出导致失败的原因 . 应用程序存在内存问题,因为在方向更改后,子片段泄露了上一个Activity(作为onAttach中的侦听器集) .

如果有人遇到同样的问题,解决方法可能是从父片段的 onAttach 手动调用子节点 onAttach .

And the question is: Is this a bug?

1 回答

  • 2

    当你执行setRetainInstance(true)时,片段会保留其配置(因此它对嵌套片段的引用,它永远不会真正分离/附加) . 例如,在configurationChange(如旋转)期间可能会发生这种情况 .

    所以这不是一个bug,而是Android的设计 .

    要回答您的问题,您可以将活动/监听器引用保留为WeakReference,以便在不再需要时将其释放 .

    另一方面,我重新考虑整个想法,似乎你应该在这里有一个观察者模式(在onStop / onPause或类似期间订阅/取消订阅监听器/观察者) .

    注意:这不会让它变得更好,我讨厌Android的生命周期方法

相关问题