前言:本文是基于Rxjava实现防止按钮重复点击
实现:
1、添加依赖
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
2、封装工具类
object ViewUtil {
fun onClick(view: View, duration: Long, onNext: Consumer<in View>): Disposable {
return ViewObservable(view).throttleFirst(duration, TimeUnit.MILLISECONDS).subscribe(onNext)
}
private class ViewObservable(view: View) : Observable<View>() {
val mView = view
override fun subscribeActual(observer: Observer<in View>?) {
if (observer != null) {
Listener(mView, observer).let {
observer.onSubscribe(it)
mView.setOnClickListener(it)
}
}
}
}
private class Listener(view: View, observer: Observer<in View>) : MainThreadDisposable(),
View.OnClickListener {
val mView = view
val mObserver = observer
override fun onDispose() {
mView.setOnClickListener(null)
}
override fun onClick(v: View?) {
if (!isDisposed && v != null) {
mObserver.onNext(v)
}
}
}
}
3、具体使用
class MainActivity : AppCompatActivity() {
private val mCompositeDisposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val disposableOne = ViewUtil.onClick(buttonOne, 500, Consumer {
Log.e("aa", "**buttonOne:" + System.currentTimeMillis())
})
val disposableTwo = ViewUtil.onClick(buttonTwo, 500, Consumer {
Log.e("aa", "**buttonTwo:" + System.currentTimeMillis())
})
mCompositeDisposable.add(disposableOne)
mCompositeDisposable.add(disposableTwo)
}
override fun onDestroy() {
super.onDestroy()
mCompositeDisposable.clear()
}
}
注:这里通过CompositeDisposable在页面onDestroy时取消订阅。