【问题标题】:is it necessary to set Fragment interface listeners to null on detach?是否有必要在分离时将 Fragment 接口侦听器设置为 null?
【发布时间】:2016-08-30 01:47:46
【问题描述】:

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

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

【问题讨论】:

  • onDetach() 只会在 Fragment 被移除时被调用。因此,在分离和重新附加场景期间,不会调用 onDetach()。我正在考虑其他一些场景。

标签: java android android-fragments interface callback


【解决方案1】:

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

以下是对您的其他问题的一些说明:

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

【讨论】:

  • 是否存在 not 在 onDetach 中将其设置为 null 可能会导致问题或次优的情况?
  • 我想不出这种情况的正常情况。也许如果您有一个长期存在的侦听器,它会执行某种引用计数或其他操作,除非您专门将其与客户端分离,否则它将无法正常工作,但我从未见过它,我认为拥有它也是一个好习惯类似的东西。
【解决方案2】:

考虑这种情况。 Activity 移除 Fragment。因此,您希望 Fragment 实例有资格进行垃圾收集。但出乎意料的是,在您的代码中的其他地方,一个变量引用了该片段实例。这样 Fragment 实例就不会被垃圾收集。它浪费了我们的记忆。

现在,如果我们没有在onDetach() 处将监听器设置为空,那么片段实例将引用监听器(这将是父活动)。所以在这里,整个 Activity 泄漏。因此,如果我们在onDetach() 处将侦听器设置为空,则只有片段实例泄漏。因此,将onDetach() 的侦听器设置为 null 是一种很好的做法。

分析你的场景,onDetach() 只会在 Fragment 被删除时被调用。所以在分离和重新附加的情况下,onDetach() 不会被调用。

【讨论】:

    【解决方案3】:

    我从不关闭任何接口侦听器,我使用了其中的一些,从来没有遇到任何问题。

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

    您也可以在官方提供的示例here中自行查看,监听器在片段中没有关闭。我认为如果有必要,谷歌至少会提到它。

    【讨论】:

      【解决方案4】:

      最好将侦听器设为空,因为您不知道垃圾收集器何时会销毁它。这样做并不是真的必要,但它是一种很好的编码风格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 2021-07-12
        • 2014-10-10
        • 2022-08-05
        • 1970-01-01
        相关资源
        最近更新 更多