Safe button click in Android
Сегодня небольшое, частичное дополнение к этому посту. Казалось бы на простую тему, но очень важную – safe button click.
И так, в Android по дефолту реализация кликов никак не ограничена. Что имеется ввиду? Если например взять обычную кнопку (Button), повесить на нее listener и кликнуть быстро несколько раз – onClick() будет вызван несколько раз и это не есть хорошо, объясню почему.
Кейс 1. Предположим у вас приложение под какой-нибудь интернет-магазин/маркетплейс или что-то подобное. У вас есть фича "Заказы", соответственно экранчик с оформлением заказа и кнопка "Оформить заказ", при нажатии на которую, запрос на бэк. Так вот, будет не очень прикольно, если создастся несколько заказов. А что если вместо заказов, будет например функциональность оплаты? Понятно, что есть 3DS и все такое, но риск все равно есть.
Кейс 2. Предположим у вас по клику стартует новая Activity. Как думаете, что будет, если тыкнуть кнопку несколько раз? Совершенно верно, Activity без проблем запустится несколько раз. Последствия зависят от логики, риски могут быть достаточно серьезными. В многих, в том числе и крупных/известных приложениях встречал такое поведение.
Кейсов можно придумать множество, от простых до достаточно критичных. Для примера я взял наиболее понятные.
Теперь про то, как такое решать?
Наиболее популярное решение, которое я видел – delay на клик. То есть, давать возможность нажать на кнопку 1 раз в 1 или несколько секунд. Надеюсь суть понятна.
Реализовать такое можно по-разному, кто-то решает через Rx, кто-то через корутины, кто-то через кастомные обработчики. Я больше предпочитаю кастомный обработчик с delay + kotlin extension для View.
Вот несколько примеров с реализациями👉Kotlin Expert [Safe Click Listener in Android]👉Android Safe Click Listener👉Ensure single click on Android👉How to prevent multiple clicks in Android Jetpack Compose