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

标签 android memory view android-activity android-fragments

行为是否类似于 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/

相关文章:

view - 在 CFWheels 项目中放置查询(尤其是长查询)的位置

android - 全屏 Activity 向导 Activity 。当我与设备交互时,如何停止显示操作栏?

android - 在android中具有固定数据报包长度的数据报套接字中的音频流质量不好

具有 2 个均匀分布的按钮的 Android 布局

.net - 确定一个类使用多少内存?

reactjs - 为什么react只有View层?

java - 基于 JSF 的触摸网站框架

c++ - RAM 上的存储单元是如何组织的,它与 C++ 有什么关系?

CS50 - 加载 - 尝试执行加载时从无处获取随机字符

java - View 添加到 ViewGroup 后不可见