안드로이드의 고질적인 문제 중에 하나인 중복 클릭 이슈가 있다.
버튼 클릭시 post 메소드인 api가 호출된다면 멱등성이 지켜지지 못할 수 있다.
ex:) 결제가 두 번 요청됨, 회원가입이 두 번 됨 등..
대표적으로 몇 가지 방법이 있다.
프로젝트에 Rxjava 프로젝트가 있다면 가장 빨리 사용할 수 있는 방법이 있다.
binding.textView.clicks()
.throttleFirst(TimeUnit Type, millis Long)
.subscribe{}
이런식으로 비교적 쉽게 가능하다.
플로우 바인딩은 rxbinding보다 비교적 유명하지 않다.
corotuine flow로 만들어져있으며 위 rxjava와 비슷하여 설명은 뛰어넘도록 하겠다.
위 두 가지 방법은 rxjava나 coroutine flow를 쓰지 않는 프로젝트에서는 중복클릭 방지를 위해 의존성을 추가하는 것이 무리가 있다.
그래서 원초적인 방법을 소개하려고 한다.
class OnThrottleClickListener(
private val clickListener: View.OnClickListener,
private val interval: Long = 800L
) :View.OnClickListener{
private var clickable = true
override fun onClick(p0: View?) {
if(clickable){
clickable = false
clickListener.onClick(p0)
p0?.run {
postDelayed({
clickable = true
},interval)
}
}
}
}
clickable 불리언 변수를 통해서 interval이 지났을 경우 다시 true로 설정되게 해준다. 이로써 중복클릭을 막을 수 있게 되었다.
extension function을 쓰면 프로젝트에서 아주 쉽게 사용할 수 있다.
fun View.onThrottleClick(interval:Long = 800L, action:(v:View) -> Unit){
val listener = View.OnClickListener { action(it) }
setOnClickListener(OnThrottleClickListener(listener,interval))
}
이런식으로 작성하면 다른 액티비티나 프래그먼트에서 기본 setOnClickListener와 똑같이 사용이 가능하다.