Почему ButterKnife использует метод DebouncingOnClickListener для методов @OnClick?

Я смотрел на сгенерированный код ButterKnife и заметил, что для аннотаций @OnClick используется DebouncingOnClickListener, реализованный библиотекой.

Что делает DebouncingOnClickListener, чтобы избежать более одного щелчка на элементе любой, используя этот прослушиватель в том же фрейме (для этого используется статический флаг). Вы можете увидеть реализацию здесь.

Я попытался найти объяснение, почему они решили использовать это для каждого события клика, управляемого библиотекой, но не смогли найти.

Итак, почему они используют это? Почему они решили, что каждый пользователь ButterKnife нуждается в этом? Не должен быть пользователь, который решает использовать это или нет? Зачем связывать ссылку на привязку к представлению, предоставляемую этой "функцией"? Что произойдет, если я хочу получить более одного щелчка на одном фрейме? Я не мог использовать ButterKnife для событий click.

Я не притворяюсь оскорбительным, просто хочу объяснения, может быть, я чего-то не хватает.

Ответ 1

Почему они решили, что каждый пользователь ButterKnife нуждается в этом?

Предположим, что у вас есть кнопка, и событие click на этой кнопке запускает новое действие. Теперь, что произойдет, когда пользователь очень быстро удвоит кнопку? Есть вероятность, что прослушиватель кликов будет запущен два раза, поэтому будут запущены 2 действия, которые вам больше всего не нужны.

Что это означает DebouncingOnClickListener, он уверяет, что последующий прослушиватель кликов не будет рассматриваться. Как только произойдет первый клик, последующие клики будут игнорироваться до следующего кадра, когда они будут включены.

Когда вы выполняете действие с представлением, вы публикуете событие на MessageQueue. Теперь, когда первый клик происходит, вы публикуете событие - запускаете новую активность. И вы немедленно отправляете другое событие - включите прослушиватель кликов в следующем кадре. Второе событие гарантировано произойдет после первого, поскольку в очереди было post() ed.

Что произойдет, если я хочу получить более одного щелчка на одном фрейме?

Если вам разрешено получать несколько последующих событий щелчка, вы должны использовать @OnTouch, потому что вы заинтересованы в событии касания и не в событиях кликов.


Слушайте @Piwai разъяснение в отношении случая Фрагментированный подкаст # 88 (начиная с 38:20).

Ответ 2

Короче говоря, это предотвратит появление ошибки, так как события касания асинхронны. Вы также можете использовать библиотеку для привязки, но назначать регулярные прослушиватели кликов.

Этот эпизод подкаста довольно хорошо охватывает его Фрагментированный 088