android - 删除 fragment 后内存未释放

标签 android android-fragments android-glide android-memory

我有一个 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/

相关文章:

java - Android 以编程方式设置 View 边距

android - android中的经度和纬度为空

android - 如何一起使用 Nav Drawer 和 FragmentActivity

android Glide 资源已准备好但图像未显示

Android Glide : prevent white image if the request fails

android - FileDescriptor在Android中的实际系统文件描述符(作为int)

javascript - Javascript中按位运算结果的区别

java - Android - 正确的多线程

android - 为什么 fragment 中的生命周期方法是公开的,而 Activity 的生命周期方法是 protected ?

android - Glide : load drawable but don't scale placeholder