Java 替换片段时内存泄漏

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

我刚刚开始使用LeakCanary,当我替换一个片段时,每次泄漏都会增加。这是金丝雀的报告:

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)?如果您的时间有限,这可能是最不需要做的工作,我认为,是的。我认为这并不重要。为了与其他生命周期回调保持一致,我通常在之后执行此操作。