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

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

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

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

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

Я не претендую на обиду, просто хочу пояснений, может я что-то упускаю.


person Alvaro Gutierrez Perez    schedule 17.10.2015    source источник
comment
Это библиотека с открытым исходным кодом. Если вас это так сильно беспокоит, я уверен, что запросы на вытягивание будут приветствоваться. Если нет, вы всегда можете раскошелиться.   -  person GreyBeardedGeek    schedule 23.10.2015


Ответы (2)


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

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

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

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

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

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


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

person azizbekian    schedule 05.07.2017
comment
По умолчанию onClickListner должен быть реализован таким образом. Позор Google - person user1209216; 14.07.2017
comment
Будь осторожен. Если вы начнете активность через намерение из метода onClick() Butterknife, это не спасет вас от обеда нескольких экземпляров. Debounce работает только для одного кадра. Новая активность может занять больше времени, чтобы раскрутиться. Это не бесполезная функция, но и не панацея. - person Maksim Turaev; 30.01.2019

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

В этом выпуске подкаста это достаточно хорошо освещено Fragmented 088

person easycheese    schedule 05.07.2017
comment
Что означает, что сенсорные события являются асинхронными? Любой пример? - person azizbekian; 08.07.2017
comment
Это означает, что событие касания обрабатывается вне основного. Таким образом, вам не гарантируется, что порядок вещей будет обработан в - person easycheese; 08.07.2017