seoft

rxjava 이용한 다중 터치 방지하기 본문

android

rxjava 이용한 다중 터치 방지하기

seoft 2020. 2. 27. 21:37

중복클릭을 방지하고자 하였고 throttleFirst를 RxView.clicks와 함께쓰는 자료가 대부분이었다.

 

RxView를 따로 쓰지않아 Util성격으로 클래스를 하나 만들었다.

 

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.subjects.BehaviorSubject
import java.util.concurrent.TimeUnit
class ClickUtil(lifecycle: Lifecycle, private val delay: Long = 1000L) : LifecycleObserver {
private lateinit var compositeDisposable: CompositeDisposable
private lateinit var clickSubject: BehaviorSubject<(() -> Unit)>
init {
lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private fun create() {
compositeDisposable = CompositeDisposable()
clickSubject = BehaviorSubject.create<(() -> Unit)>()
compositeDisposable.add(
clickSubject.throttleFirst(delay, TimeUnit.MILLISECONDS)
.subscribe {
it.invoke()
})
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private fun destroy() {
compositeDisposable.dispose()
}
fun run(hof: () -> Unit) {
clickSubject.onNext(hof)
}
}
view raw ClickUtil.kt hosted with ❤ by GitHub

 

사용은 전역으로 ClickUtil 객체를 하나 생성후 click.run에 실행할 부분을 넣어주면 된다. 

 

// in activity
class SettingInFingerActivity : AppCompatActivity() {
private val click by lazy { ClickUtil(this.lifecycle) }
// (생략)
private fun initListener() {
testButton.SetOnClickListener {
click.run {
Log.i("TAG", "다중 터치 방지")
}
}
}
// (생략)
}
view raw usage.kt hosted with ❤ by GitHub

 

lifecycle을 넘기므로 rxjava의 dispose 를 신경 쓰지 않아도 된다.

Comments