【问题标题】:How do I avoid a memory leak from a static fragment context?如何避免来自静态片段上下文的内存泄漏?
【发布时间】:2018-01-11 16:12:54
【问题描述】:

我不断收到关于我的静态片段实例内存泄漏的警告。 我声明如下:

私有静态 myFragment thisFragment;

在这里调用它:

public static myFragment newInstance() {

        if (thisFragment == null) {
            thisFragment = new myFragment();
        }
        return thisFragment;
    }

我该如何解决这个问题?有什么想法吗?

谢谢!

【问题讨论】:

  • 持有对片段的静态引用的目的是什么?
  • 只要每次调用方法时创建一个新的片段实例,就像方法名所暗示的那样。

标签: android android-fragments memory-leaks android-context android-memory


【解决方案1】:

嗯,有 3 种可能的解决方案:

1) 不创建静态片段。它们总是绑定到上下文,所以,它们不应该是静态的。考虑重构您的应用架构。

2) 当上下文被销毁时(activity onStop)将片段实例设置为null

3) 对不包含 GC 实例的片段字段使用 Wea​​kReference。

UPD: 3) 的示例

class ExampleFragment extends Fragment {

    private static WeakReference<Fragment> instance;

    public static ExampleFragment getInstance() {
        if (instance == null) {
            instance = new WeakReference<>(new ExampleFragment());
        }
        return instance.get();
    }
}

【讨论】:

  • 你能给我每个关于我的代码的例子吗,会很有帮助的。
  • 嗯。我需要更多您的代码来提供 1) 或 2) 的示例。但是 3) 是非常微不足道的。更新了我的答案
  • 关于 2,onstop,我设置 thisfragment = null; ,这就够了吗?
  • 是的,每个解决方案都足够了 :)。实际上,当您将 thisfragment 设置为 null 时,您会释放上下文并让 GC 收集它
  • 太棒了,非常感谢,我喜欢弱引用的用法。不能保证onstop。另外,在我的 baseapplication 文件中,我有另一个可能泄漏的静态变量,一些自定义连接参数,是否也可以为此设置弱引用而不仅仅是片段?
【解决方案2】:

你永远不应该持有对 Context 的静态引用。

为什么需要对片段进行静态引用?如果您回答了这个问题,那么我们可以指导您如何避免它。

静态引用永远不会消失,并且片段上下文很可能在某个时候链接到 Activity 上下文,这意味着所有这些元素永远不会被垃圾回收。这真的很糟糕。

【讨论】:

  • 嗯...在静态引用中保存片段是绝对糟糕的。但是,如果您使用 Wea​​kReference 或及时释放链接,则在静态字段中保存上下文可能是安全的。也可以在静态中保存应用程序上下文
猜你喜欢
  • 2016-07-25
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多