gpt4 book ai didi

android - onAttach() 未使用 setRetainInstance(true) 调用;

转载 作者:太空狗 更新时间:2023-10-29 13:23:44 26 4
gpt4 key购买 nike

我有一个包含单个子 fragment 的父 fragment , fragment 的 onAttachonCreateView 方法都被记录下来用于调试目的。

当我以这种方式将父 fragment 添加到 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!

总而言之,如果父 fragment 是保留 fragment ,则不会调用子 fragment 的 onAttach 方法(我假设 onDetach 均未调用)。这个场景只是一个演示,我实际上不得不调试一个复杂的应用程序以找出导致失败的原因。该应用程序存在内存问题,因为方向更改后,子 fragment 泄漏了先前的 Activity(作为 onAttach 中设置的监听器)。

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

问题是:这是一个错误吗?

最佳答案

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

所以这不是错误,这是 Android 的设计。

要回答您的问题,您可以将 Activity/Listener 引用保留为 WeakReference,以便在不再需要时将其释放。

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

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

关于android - onAttach() 未使用 setRetainInstance(true) 调用;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24639249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com