android 중복 클릭 방지하기

James_·2022년 9월 26일
0

안드로이드의 고질적인 문제 중에 하나인 중복 클릭 이슈가 있다.
버튼 클릭시 post 메소드인 api가 호출된다면 멱등성이 지켜지지 못할 수 있다.
ex:) 결제가 두 번 요청됨, 회원가입이 두 번 됨 등..

대표적으로 몇 가지 방법이 있다.

Rxjava,Rxbinding

프로젝트에 Rxjava 프로젝트가 있다면 가장 빨리 사용할 수 있는 방법이 있다.

binding.textView.clicks()
		.throttleFirst(TimeUnit Type, millis Long)
        .subscribe{}

이런식으로 비교적 쉽게 가능하다.

Flowbinding

플로우 바인딩은 rxbinding보다 비교적 유명하지 않다.
corotuine flow로 만들어져있으며 위 rxjava와 비슷하여 설명은 뛰어넘도록 하겠다.

위 두 가지 방법은 rxjava나 coroutine flow를 쓰지 않는 프로젝트에서는 중복클릭 방지를 위해 의존성을 추가하는 것이 무리가 있다.
그래서 원초적인 방법을 소개하려고 한다.

OnClickListener 클래스 만들기

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와 똑같이 사용이 가능하다.

profile
Android 개발자

0개의 댓글