gpt4 book ai didi

android - 删除 fragment 后内存未释放

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:07:35 25 4
gpt4 key购买 nike

我有一个 Fragment,它有一个 RecyclerView

在这个 RecyclerView 中,我可能会偶尔下载并显示图像(使用 Glide 加载到 ImageView 中。

因此,当我打开 Fragment 时,使用的内存有时可能会从 30MB 左右跳到 100MB 左右甚至更多。

持有 FragmentActivity 完成后,内存不会释放。它和以前一样。

我检查了Glide文档,显然我们不必担心释放 RecyclerView 中的 Bitmaps。这是一个很大的问题,因为应用程序经常因此而因 OOM 而崩溃。

Fragment 被删除时,我应该如何正确处理释放内存?

编辑:另一个观察结果

我注意到的另一件事是,如果我完成 Activity,然后再次启动相同的 Activity。内存会跳回一会儿,然后回升到 100MB,这让我相信在再次启动 Fragment 之前内存已被清除。

最佳答案

垃圾收集有时是 Android 中的一个痛苦问题。大多数开发人员没有考虑这个问题,只是在没有任何资源分配意识的情况下继续开发。

这当然会导致内存泄漏、OOM和不必要的资源绑定(bind)等问题。 绝对没有自动释放内存的方法。在任何情况下,您都不能完全依赖垃圾收集器

每当您传递 Fragment 或 Activity 的onDestroy() 方法时,您可以而且应该做的是清除应用程序中不再需要的任何结构。您可以执行以下操作:

  1. 避免听众的匿名实例。创建监听器并在您不再需要它们时销毁它们。
  2. 将所有监听器(点击、长按等)设置为空
  3. 清除所有变量、数组。对 Activity/Fragment 中包含的所有类和子类应用相同的过程
  4. 每当您对给定类执行上述任何步骤时,将变量设置为 null(适用于所有变量)

我最终做的是创建一个类似的界面

public interface clearMemory(){
void clearMemory();
}

并在每个类上实现它,无论是 Activity、Fragment 还是普通类(包括适配器、自定义 View 等)。

然后我会在类被销毁时调用该方法(因为应用程序正在被销毁或每当我觉得需要这样做时。注意不要在正常运行时处理)

@Override
public void onDestroy(){
clearMemory();
}

public void clearMemory(){
normalButtonOnClickListener = null;
normalButton.setOnClickListener(null);
normalButton = null;
myCustomClass.clearMemory(); // apply the interface to the class and clear it inside
myCustomClass = null;
simpleVariable = null;
...
}

通过以系统的方式实现这一点,我的应用程序的内存管理变得更加简单和精简。然后,人们就可以准确地知道/控制内存的处理方式和时间。

关于android - 删除 fragment 后内存未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592211/

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