gpt4 book ai didi

android - 当 Fragment 被替换并放入回栈(或删除)时,它是否保留在内存中?

转载 作者:IT老高 更新时间:2023-10-28 13:13:36 30 4
gpt4 key购买 nike

行为是否类似于 Activity 的工作方式?例如,对于 Activity ,它的工作方式如下:

Activity A启动Activity B,当B在屏幕上时,系统可以移除A如果系统需要,则从内存中获取。按 BACK 后,A 将被重新创建到内存中,就好像它从未离开过一样。

我一直在寻找一个清晰的解释,说明 fragment 在内存方面会发生什么,但没有找到任何东西。它的工作方式相同吗?例如:

Activity C 在其布局中有Fragment F。然后,在某些时候 FFragment G 替换,但 F 保留在其后堆栈中。

F 会一直保留在内存中直到 C 被杀死,还是系统可以根据需要将其删除?

我真正要问的是,如果我在单个 Activity 中有一堆复杂的 Fragment,我是否会冒内存不足的风险?

最佳答案

看看这个:BackStackRecord.Op.fragment

这就是 fragment 存储在后台堆栈中的方式。注意实时引用,那里既没有使用 WeakReference 也没有使用 SoftReference

现在是:FragmentManagerImpl.mBackStack

这是管理器存储后台堆栈的地方。简单的 ArrayList,同样,没有 WR 或 SR。

最后是:Activity.mFragments

这是对 fragment 管理器的引用。

GC 只能收集没有实时引用的对象(不能从任何线程访问)。这意味着,直到您的 Activity 被销毁(因此,FragmentManager 引用消失了),GC 将无法收集返回堆栈中的任何 Fragment

请注意,当 Activity 被销毁时,retains state (就像当您将设备切换到横向模式时),它不会在堆栈中保留实际的 Fragment 对象,只保留它们的状态 - Fragment.FragmentState对象,即每次使用保留状态重新创建 Activity 时,都会重新创建后台堆栈中的实际 fragment 。

希望这会有所帮助。

PS 所以,简而言之:是的,您可以通过将 Fragments 添加到 back stack 以及添加许多 View 来查看层次结构。

UPD 考虑到您的示例,F 将保留在内存中,直到 C 被杀死。如果 C 被杀死然后以不同的配置复活 - F 也将被破坏并在不同的对象中重生。因此,F 的内存占用会一直持续到 C 丢失状态或清除返回堆栈。

关于android - 当 Fragment 被替换并放入回栈(或删除)时,它是否保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8482606/

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