是否有必要在分离时将Fragment接口侦听器设置为null?

时间:2016-05-04 14:32:53

标签: java android android-fragments interface callback

在涉及回调的Fragment示例中,通常它们在onAttach方法中分配侦听器,然后在onDetach方法中将侦听器设置为null。

这是最后一部分吗?片段分离/销毁时,侦听器是否自动设置为null?或者在某些情况下你可能会分离片段并将其重新附加到其他地方,并且你不希望回调指向任何特定的东西,直到它被重新附加到某个东西上?

4 个答案:

答案 0 :(得分:8)

我从未明确设置对null的侦听器引用,因为在大多数情况下它不会产生任何影响。

以下是对其他问题的一些澄清:

  • 当片段被分离/销毁时,侦听器是否自动设置为null?并不是的。 onDetach()onDestroy()反映了组件生命周期,但不反映对象生命周期。那里什么都不会自动发生。当您的片段实例被垃圾收集时,对该侦听器的引用将被破坏。如果这是对您的侦听器的唯一引用,则它也有资格进行垃圾回收。
  • 或者是否存在可能会分离片段并将其重新附加到其他位置的情况,并且在重新连接到某些内容之前,您不希望回调指向任何特定内容?我会说这是不太可能的。在正常用例中,您必须在onAttach()中分配侦听器,因此您确信可以正确委派事件。在onDetach()之后,在重新附加片段之前,您将不会收到任何需要委派的事件。并且,如果您重新附加它,那么您将拥有正确的侦听器实例,因为您已经在onAttach()中处理了该实例。

答案 1 :(得分:3)

最好使侦听器为空,因为您不知道垃圾收集器何时会销毁它。这不是必须这样做,但它是良好的编码风格。

答案 2 :(得分:3)

考虑这种情况。活动删除片段。因此,您希望Fragment实例符合垃圾收集的条件。但出乎意料的是,在代码中的其他位置,一个变量引用了该片段实例。所以Fragment实例不会被垃圾收集。它浪费了我们的记忆。

现在,如果我们没有在<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_height="?attr/actionBarSize" .../> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" ...> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" ...> </RelativeLayout> </ScrollView> </RelativeLayout> 处将侦听器设置为null,则片段实例会引用侦听器(它将是父Activity)。所以在这里,整个Activity泄漏了。因此,如果我们在onDetach()将侦听器设置为null,则只有片段实例泄漏。因此,在onDetach()将侦听器设置为null是一种很好的做法。

分析您的方案时,只有在删除片段时才会调用onDetach()。因此,在分离和重新附加场景中,onDetach()不会被调用。

答案 3 :(得分:3)

我从不关闭任何界面侦听器,我使用它们中的任何一个,从来没有遇到任何问题。

解释communication between fragments的官方文档也没有关闭示例中的监听器。

您也可以在官方样本here中自行检查,听众未在片段中关闭。我认为如果有必要,谷歌至少会提到它。