如何避免静态片段上下文的内存泄漏?
How do I avoid a memory leak from a static fragment context?
我不断收到关于我的静态片段实例内存泄漏的警告。
我声明如下:
私有静态 myFragment thisFragment;
并在这里调用它:
public static myFragment newInstance() {
if (thisFragment == null) {
thisFragment = new myFragment();
}
return thisFragment;
}
我该如何解决这个问题?有什么想法吗?
谢谢!
那么,有 3 种可能的解决方案:
1) 不创建静态片段。它们总是绑定到上下文,因此,它们不应该是静态的。考虑重构您的应用架构。
2) 当上下文被销毁时将片段实例设置为 null
(activity onStop)
3) 将 WeakReference 用于 fragment 字段,它不会保存来自 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();
}
}
您永远不应该持有对上下文的静态引用。
为什么需要保存对片段的静态引用?如果您回答了这个问题,那么我们可以指导您如何避免它。
静态引用永不消亡,片段上下文很可能在某个时候链接到 Activity 上下文,这意味着所有这些元素永远不会被垃圾收集。这真的很糟糕。
我不断收到关于我的静态片段实例内存泄漏的警告。 我声明如下:
私有静态 myFragment thisFragment;
并在这里调用它:
public static myFragment newInstance() {
if (thisFragment == null) {
thisFragment = new myFragment();
}
return thisFragment;
}
我该如何解决这个问题?有什么想法吗?
谢谢!
那么,有 3 种可能的解决方案:
1) 不创建静态片段。它们总是绑定到上下文,因此,它们不应该是静态的。考虑重构您的应用架构。
2) 当上下文被销毁时将片段实例设置为 null
(activity onStop)
3) 将 WeakReference 用于 fragment 字段,它不会保存来自 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();
}
}
您永远不应该持有对上下文的静态引用。
为什么需要保存对片段的静态引用?如果您回答了这个问题,那么我们可以指导您如何避免它。
静态引用永不消亡,片段上下文很可能在某个时候链接到 Activity 上下文,这意味着所有这些元素永远不会被垃圾收集。这真的很糟糕。