为什么 ButterKnife 对 @OnClick 方法使用 DebouncingOnClickListener?

Why ButterKnife uses a DebouncingOnClickListener for @OnClick methods?

我正在查看 ButterKnife 的生成代码,并注意到对于 @OnClick 注释,它使用由库实现的 DebouncingOnClickListener

DebouncingOnClickListener 的作用是避免在同一帧上使用该侦听器多次单击 any 元素(为此,他们使用静态标志) .可以看到实现here.

我试图找到解释为什么他们决定对库管理的每个点击事件使用它,但找不到任何解释。

那么,他们为什么使用它? 为什么他们决定 ButterKnife 的每个用户都需要这个? 不应该是决定使用它的用户吗? 为什么要将它提供的视图绑定帮助与这个 "feature" 结合起来? 如果我想在同一帧上收到多次点击,会发生什么情况?我无法将 ButterKnife 用于点击事件。

我不是装逼,只是想一个解释,可能是我漏掉了什么。

长话短说,这是为了防止发生错误,因为触摸事件是异步的。您还可以使用该库进行绑定,但在点击监听器上分配常规。

这个播客节目涵盖得很好 Fragmented 088

Why have they decided that every user of ButterKnife need this?

假设您有一个按钮,此按钮上的单击事件会启动一个新的 activity。现在,当用户快速双击按钮时会发生什么?有可能点击侦听器会被触发两次,因此会启动 2 个活动,这很可能是您不想要的。

DebouncingOnClickListener 所做的是确保不会考虑后续的点击侦听器。一旦第一次点击发生,随后的点击将被忽略,直到下一帧,届时它们将 打开

当您使用视图执行操作时,您是在 MessageQueue. Now, when first click happens, you are posting an event - launch new activity. And you are immediately posting another event - enable click listener, on the next frame. The second event is guaranteed to happen after the first one, because is has been post()ed 上将事件发布到队列中。

What happens if I want to receive more than one click on the same frame?

如果您可以接受多个后续点击事件,那么您应该使用 @OnTouch,因为您对触摸事件感兴趣,对点击事件不感兴趣 .


@Piwai's clarification concerning the case at Fragmented Podcast #88(从38:20开始)。