删除片段后内存不会释放

时间:2016-07-26 14:10:07

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

我的Fragment有一个RecyclerView

在此RecyclerView中,我偶尔会下载并显示图片(加载GlideImageView

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

在保持Activity的{​​{1}}完成后,内存不会释放。它和以前一样。

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

如果删除RecyclerView,我应该如何正确处理释放内存?

编辑:另一个观察

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

2 个答案:

答案 0 :(得分:5)

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

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

每当您传递片段或活动 onDestroy()方法时,您可以做和应该做的就是删除不再需要的任何构造< / strong>在申请中。您可以执行以下操作:

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

    这样的界面
    public interface clearMemory(){
        void clearMemory();
    }
    

    并在每个类上实现它,无论是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;
        ...        
    }
    

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

答案 1 :(得分:2)

这增加了里卡多的答案。

您可以添加以下代码以在Android中启动垃圾回收:
    Runtime.getRuntime().gc();

注意:在将所有局部变量设为null后调用此函数。执行此代码并不能保证系统会在您的应用程序上进行垃圾收集,它只是暗示它可能是进行此操作的好时机。
我在我的所有活动中都使用了这个onDestroy(),它似乎总是在我想要的时候起作用 尝试一下,它可能会帮助你。