gpt4 book ai didi

android - FragmentManager 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 02:25:57 27 4
gpt4 key购买 nike

更新:

我认为泄漏来自 getActivity().getSupportLoaderManager().restartLoader(getLoaderId(), null, this);我的对象实现 LoaderCallback 的地方。有没有办法清除我厌倦的回调

getActivity().getSupportLoaderManager().restartLoader(getLoaderId(), null, null);

但这会崩溃

来源:

我的一个 fragment (A) 中有一个对象列表。当我向前导航时,我将 fragment A 添加到后台。在我导航到一个新 fragment 后,我转储了堆。我仍然在堆中看到我的对象。当我在转储中获得最短路径时,它看起来如下所示。我可以看到在 FragmentManagerImpl 中有对 mActive fragment 中 fragment A 的引用,这使我的列表对象保持 Activity 状态。

memory leak

我的 fragment 应该留在 mActive fragment 中还是这是泄漏?

添加到后台

FragmentTransaction transaction = mFragmentManager.beginTransaction();
updateTransactionWith(info.getReplacement(), transaction, "replace");
transaction.addToBackStack(info.getReplacement().getClass().toString());
transaction.commit();
mFragmentManager.executePendingTransactions();

最佳答案

通过调用 addToBackStack(),您请求 FragmentManager 将被替换的 Fragment 停止 而不是 destroyed 因为您预计很可能会按下后退按钮,或者 Fragment 初始化很重,您仍然希望避免再次执行此操作即使用户不太可能返回。

docs明确指出

If you do not call addToBackStack() when you perform a transaction that removes a fragment, then that fragment is destroyed when the transaction is committed and the user cannot navigate back to it.

Whereas, if you do call addToBackStack() when removing a fragment, then the fragment is stopped and will be resumed if the user navigates back.

因此,这不是内存泄漏,您的观察结果与预期行为非常一致。

但是,就像一个Activity,如果内存不足,系统仍然可以选择销毁这个Fragment。但是,这也是预期的行为。

关于android - FragmentManager 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27913009/

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