我的Fragment
有一个RecyclerView
。
在此RecyclerView
中,我偶尔会下载并显示图片(加载Glide到ImageView
。
因此,当我打开Fragment
时,已用内存有时会从大约30MB跳到大约100MB甚至更多。
在保持Activity
的{{1}}完成后,内存不会释放。它和以前一样。
我查看了Glide文档,显然我们不必担心在Fragment
中释放Bitmaps
。这是一个很大的问题,因为应用程序经常因为OOM而崩溃。
如果删除RecyclerView
,我应该如何正确处理释放内存?
编辑:另一个观察
我注意到的另一件事是,如果我完成Fragment
,然后再次启动相同的Activity
。内存将跳回一段时间然后再回到100MB,这让我相信在再次启动Activity
之前内存已被清除。
答案 0 :(得分:5)
垃圾收集有时是Android中的一个痛苦问题。 大多数开发人员都没有考虑这个问题,只是继续开发而没有任何资源分配意识。
这当然会导致内存问题,例如泄漏,OOM和不必要的资源绑定。 绝对没有自动释放内存的方法。在任何情况下,您都不能完全依赖垃圾收集器
每当您传递片段或活动 onDestroy()方法时,您可以做和应该做的就是删除不再需要的任何构造< / strong>在申请中。您可以执行以下操作:
我最终做的是创建一个像
这样的界面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()
,它似乎总是在我想要的时候起作用
尝试一下,它可能会帮助你。