Java 替换片段时内存泄漏
我刚刚开始使用LeakCanary,当我替换一个片段时,每次泄漏都会增加。这是金丝雀的报告:Java 替换片段时内存泄漏,java,android,android-fragments,memory-leaks,leakcanary,Java,Android,Android Fragments,Memory Leaks,Leakcanary,我刚刚开始使用LeakCanary,当我替换一个片段时,每次泄漏都会增加。这是金丝雀的报告: android.widget.LinearLayout instance Leaking: YES (ObjectWatcher was watching this because com.home.app1.PostFragment received Fragment#onDestroyView() callback (references to its views shoul
android.widget.LinearLayout instance
Leaking: YES (ObjectWatcher was watching this because com.home.app1.PostFragment received Fragment#onDestroyView() callback
(references to its views should be cleared to prevent leaks))
这是我的片段替换代码:
public void change(Fragment fragment) {
((FragmentActivity) context).getSupportFragmentManager().beginTransaction()
.replace(R.id.frameLayout, fragment, "fragment")
.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.addToBackStack(null)
.commit();
}
因此,我对So进行了研究,有人说必须在onDestroyView
中提示视图。然后我在onDestroyView中尝试了这个方法:fragmentView=null代码>但没有任何更改。我也试过:
if (view.getParent() != null) {
((ViewGroup) view.getParent()).removeView(view);
}
但还是没有任何改变。因此,我尝试将所有视图设置为空,如下所示:
@Override
public void onDestroyView() {
super.onDestroyView();
backButton=null;
swipeLayout=null;
imageView=null; ...etc.
}
最终,泄漏金丝雀上的泄漏警告消失了。但我认为这不是一个解决办法,也没有意义,因为可能有很多观点。那么,有什么办法可以避免这种泄漏呢?谢谢
所以我尝试将所有视图设置为空,如下所示
最终,泄漏金丝雀上的泄漏警告消失了
您已经找到了解决方案-在删除并应该销毁引用(onDestroyView
)后,您一直在保留View
引用(您的backButton
、swipeLayout
、imageView
)。因为持有对它们的引用可以防止它们被垃圾收集,这就是内存泄漏
但我认为这不是一个解决办法,也没有意义,因为可能会有
许多观点。那么,有什么办法可以避免这种泄漏呢
如果手动将View
s存储在成员变量中,这是最好的解决方案。您可以每次使用findViewById
查找它,但我不推荐使用它,因为重复遍历视图层次结构会导致性能下降
通过使用Android开发工具的特性,您可以避免这两个问题。这样,您就只需要处理一个绑定对象
您还可以使用管理视图变量-请参阅unbinder.unbind()代码>该页上提到的模式。添加泄漏跟踪请理解您的建议。但有很多代码,我并没有太多时间做这个项目。因此,目前我无法替换所有的findviewbyd
方法。所以在这种情况下,我是否应该继续使用第一种解决方案(null out)?如果您的时间有限,这可能是最不需要做的工作,我认为,是的。我认为这并不重要。为了与其他生命周期回调保持一致,我通常在之后执行此操作。