点击防抖动

前言:本文是基于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时取消订阅。

猜你喜欢

转载自blog.csdn.net/yufumatou/article/details/108883864