如何避免静态片段上下文中的内存泄漏?

时间:2017-08-03 21:17:38

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

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

private static myFragment thisFragment;

并在此处致电:

public static myFragment newInstance() {

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

我该如何解决这个问题?任何想法?

谢谢!

2 个答案:

答案 0 :(得分:5)

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

1)不创建静态片段。它们总是与上下文绑定,因此,它们不应该是静态的。考虑重构您的应用程序架构。

2)在销毁上下文时将片段实例设置为null(活动onStop)

3)将WeakReference用于片段字段,该字段不能保存来自GC的实例。

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 :(得分:1)

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

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

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