当前位置: 首页 > 知识库问答 >
问题:

是否有必要在分离时将片段接口侦听器设置为空?

秦才
2023-03-14

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

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

共有3个答案

刘泰
2023-03-14

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

解释片段之间通信的官方文档也没有关闭示例中的侦听器。

您也可以在这里提供的官方示例中自行检查,听众在片段中没有关闭。我想如果有必要,谷歌至少会提到它。

麻阳
2023-03-14

考虑这个场景。活动删除片段。因此,您希望片段实例可以进行垃圾收集。但出乎意料的是,在代码的其他地方,一个变量引用了该片段实例。这样片段实例就不会被垃圾收集。这是在浪费我们的记忆。

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

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

程鸿畅
2023-03-14

我从未将侦听器引用显式设置为null,因为在大多数情况下,这不会产生任何影响。

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

  • 当片段被分离/销毁时,侦听器不会自动设置为null吗?不完全是。onDetach()onDestroy()反映组件生命周期,但不反映对象生命周期。那里不会自动发生任何事情。当您的片段实例被垃圾收集时,对侦听器的引用将随之销毁。如果这是对您的侦听器的唯一引用,它也将符合垃圾回收机制的条件。
  • 或者在某些情况下,您可能会分离片段并将其重新附加到其他地方,并且您不希望回调指向任何特定的东西,直到它重新附加到某个东西?我会说这是极不可能的。在正常用例中,您必须在onAttach()中分配侦听器,因此您可以确保可以正确委托事件。在onDetach()之后,您不会收到任何需要委托的事件,直到您重新附加片段。而且,如果您重新附加它,那么您将拥有正确的侦听器实例,因为您已经在onAttach()中处理了它。
 类似资料:
  • 问题内容: 在涉及回调的Fragment示例中,通常它们在onAttach方法中分配侦听器,然后在onDetach方法中将侦听器设置为null。 这最后一部分是必要的吗?片段被分离/销毁时,监听器是否不会自动设置为null?还是在某些情况下,您可能会分离该片段并将其重新附加到其他位置,并且您不希望回调指向特定的内容,直到它重新附加至某个内容? 问题答案: 我从来没有明确地将监听器引用设置为,因为在

  • 问题内容: 按下手机上的按钮时,我想执行自定义操作。 是否可以在按钮上设置onClickListener(或类似按钮)? 仅在第一次按下按钮时才被调用-我已经尝试过了。 问题答案: 通常,您不应因为用户期望菜单出现而覆盖行为,但是您可以沿以下方式使用:

  • 通常在片段中,我在onAttach()中附加一个监听器,并在onDetach()中取消监听器。 是否需要在onDetach()中将侦听器设置为null? 虽然我这样做是因为它使代码看起来更加对称,但似乎没有必要这样做,因为片段已经被销毁了,因为根据片段的生命周期,之前已经调用了onDestroyView()和onDestroy()。 提前谢谢。

  • 我要做的是设置一个SOCKS服务器,然后将其端口添加为SSH隧道连接中的本地侦听端口。我想要实现的是动态端口转发(如果我没记错的话,ssh中的-d选项)。我使用JSch进行SSH隧道。以下是我到目前为止的代码(从http://kahimyang.info/kauswagan/code-blogs/1337/ssh-tunneling-with-java-a-database-connection-

  • 我目前正在一个单一的活动应用程序中工作,该应用程序为每个屏幕使用片段。我也在使用MVP设计模式。 上下文 我有一个片段(Fragment-a),其中有一个项目列表。此片段处理每个项的操作。因为它可以访问演示者 我想要什么? 如何将Frainsion-A作为侦听器传递给DialogFraank(Frainsion-B),以便我可以从DialogFraank调用操作?