在片段中保存活动实例:是否会导致内存泄漏?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在片段中保存活动实例:是否会导致内存泄漏?相关的知识,希望对你有一定的参考价值。

我有一些Activity与一些Fragments。从每个片段,我需要调用Activity实现的aMethod()。所以,我做这样的事情:

((MyActivity)getActivity()).aMethod();

我多次引用这个活动,所以我决定引用这个活动。创建片段时,我有:

MyActivity act; // this s a fragment's member
//...
act = (MyActivity) getActivity();

我想知道是否持有该引用可能会导致内存泄漏。

如果是这样,我想到了两个解决方案:

  1. 碎片被破坏时act = null;onDestroy()
  2. 使用WeakReferenceact = new WeakReference((MyActivity) getActivity());

两者都有效吗?是否有意义?

答案

不,这不是内存泄漏。

我们从可以加载片段的地方获取Activity的实例。

所以你还需要传递Activity或As的实例,你已经通过castA和getActivity()是正确的。

但是记住有一件事,只要onPause(),onStop()和onDestroy()在那时调用释放instace的实例,否则它保存内存和垃圾收集器不清除它所以在这样的情况下/情况只发生内存泄漏。

另一答案

你甚至不需要持有参考。继续使用

getActivity()

片段生命周期与其活动的生命周期相结合,因此您无需担心它。

如果您仍想存储引用,可以安全地使用WeakReference,就像您自己说的那样。

这将使引用在需要时可用于垃圾收集。在使用引用之前,只需保持非null的检查。

以上是关于在片段中保存活动实例:是否会导致内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

带有 UI 和内存泄漏的保留片段

在另一个活动托管的片段之间传递数据的最佳实践

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

创建片段而不从 java 代码实例化它

避免android片段中内存泄漏的最佳方法是啥

如何在所有活动和片段中使用 MediaPlayer 的单个实例?