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

Alv*_*rez 12 android listener android-view onclicklistener butterknife

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

这是DebouncingOnClickListener为了避免在同一帧上使用该侦听器多次单击任何元素(实现此目的,它们使用静态标志).你可以在这里看到实现.

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

那么,为什么他们使用它呢?为什么他们决定ButterKnife的每个用户都需要这个?不应该是决定使用它的用户?为什么要将视图绑定帮助它提供这个"功能"?如果我想在同一帧上多次点击,会发生什么?我无法使用ButterKnife进行点击活动.

我不假装冒犯,只想要一个解释,也许我错过了什么.

azi*_*ian 6

为什么他们决定ButterKnife的每个用户都需要这个?

假设您有一个按钮,此按钮上的单击事件将启动一个新活动.现在,当用户快速双击按钮时会发生什么?有一次机会,点击监听器将被触发两次,因此将启动2个活动,这是您最不希望的.

这样DebouncingOnClickListener做可以确保不会考虑后续的点击监听器.一旦第一次点击发生,后续点击将被忽略,直到下一帧,它们将被打开.

当您使用视图执行操作时,您正在发布一个事件MessageQueue.现在,当第一次点击发生时,您正在发布一个事件 - 启动新活动.并且您将立即在下一帧发布另一个事件 - 启用单击侦听器.第二个事件保证在第一个事件之后发生,因为已经post()编入队列.

如果我想在同一帧上多次点击,会发生什么?

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


听听@Piwai关于碎片播客#88(从38:20开始)的案例的澄清.

  • 当心。如果您通过来自 butterknife 的 onClick() 方法的意图开始活动,它不会使您免于多个实例的午餐。去抖动仅适用于一帧。新活动可能需要更长的时间才能启动。它不是无用的功能,但也不是灵丹妙药。 (3认同)