删除片段后内存不会释放

Guy*_*Guy 10 android android-fragments android-memory android-glide

我有一个FragmentRecyclerView.

在这里RecyclerView,我偶尔可以下载并显示图像(加载GlideImageView.

因此,当我打开时Fragment,使用过的内存有时会从大约30MB跳到大约100MB甚至更多.

Activity持有Fragment完成之后,内存不会释放.它和以前一样.

我检查滑翔文档,显然我们不必担心释放BitmapsRecyclerView.这是一个很大的问题,因为应用程序经常因为OOM而崩溃.

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

编辑:另一个观察

我注意到的另一件事是,如果我完成了Activity,然后Activity再次开始相同.内存将跳回一段时间然后再回到100MB,这让我相信在Fragment再次启动之前内存已被清除.

Ric*_*ira 5

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

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

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

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

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

public interface clearMemory(){
    void clearMemory();
}
Run Code Online (Sandbox Code Playgroud)

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

然后,每当要销毁类时,我都会调用该方法(因为应用程序被销毁或者我觉得需要这样做.小心不要在正常的运行时中处理)

@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;
    ...        
}
Run Code Online (Sandbox Code Playgroud)

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