我有一个 Fragment
,它有一个 RecyclerView
。
在这个 RecyclerView
中,我可能会偶尔下载并显示图像(使用 Glide 加载到 ImageView
中。
因此,当我打开 Fragment
时,使用的内存有时可能会从 30MB 左右跳到 100MB 左右甚至更多。
持有 Fragment
的 Activity
完成后,内存不会释放。它和以前一样。
我检查了Glide文档,显然我们不必担心释放 RecyclerView
中的 Bitmaps
。这是一个很大的问题,因为应用程序经常因此而因 OOM 而崩溃。
当 Fragment
被删除时,我应该如何正确处理释放内存?
编辑:另一个观察结果
我注意到的另一件事是,如果我完成 Activity
,然后再次启动相同的 Activity
。内存会跳回一会儿,然后回升到 100MB,这让我相信在再次启动 Fragment
之前内存已被清除。
最佳答案
垃圾收集有时是 Android 中的一个痛苦问题。 大多数开发人员没有考虑这个问题,只是在没有任何资源分配意识的情况下继续开发。
这当然会导致内存泄漏、OOM和不必要的资源绑定(bind)等问题。 绝对没有自动释放内存的方法。在任何情况下,您都不能完全依赖垃圾收集器
每当您传递 Fragment 或 Activity 的onDestroy() 方法时,您可以而且应该做的是清除应用程序中不再需要的任何结构。您可以执行以下操作:
- 避免听众的匿名实例。创建监听器并在您不再需要它们时销毁它们。
- 将所有监听器(点击、长按等)设置为空
- 清除所有变量、数组。对 Activity/Fragment 中包含的所有类和子类应用相同的过程
- 每当您对给定类执行上述任何步骤时,将变量设置为 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/