app的build.gradle,导入Rxjava库
implementation : "io.reactivex:rxjava:1.2.10"
1.新建xxxSubscribe类实现Observable.OnSubscribe<View>
private static final String TAG = "ClickSubscribe";
private Subscriber mSubscriber;
public ClickSubscribe(View view) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LogUtils.e(TAG, v.getClass().getSimpleName() + "我被点击了");
mSubscriber.onNext(v);
}
});
}
@Override
public void call(Subscriber<? super View> subscriber) {
mSubscriber = subscriber;
}
2.运用操作符
throttleFirst(time,TimeUnit.SECONDS)
如下方式
Observable.create(new ClickSubscribe(nextBtn))
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Action1<View>() {
//todo dothing
}
RxJava2版本
private lateinit var dispose: Disposable
/**
* 防止重复点击
*
* @param target 目标view
* @param action 监听器
*/
fun setOnClickListeners(vararg target: View, action: Action1) {
for (view in target) {
dispose = onClick(view)
.throttleFirst(5000, TimeUnit.MILLISECONDS)
.subscribe {
action.onClick(view)
}
}
}
/**
* 防止重复点击
*
* @param target 目标view
* @param action 监听器
*/
fun setOnClickListeners(target: View, action: Action1) {
dispose = onClick(target)
.throttleFirst(1000, TimeUnit.MILLISECONDS)
.subscribe {
action.onClick(target)
}
}
/**
* 监听onclick事件防抖动
*
* @param view
* @return
*/
@CheckResult
private fun onClick(view: View): Observable<*> {
return Observable.create(ViewClickOnSubscribe(view))
}
/**
* onclick事件防抖动
* 返回view
*/
private class ViewClickOnSubscribe(val view: View) : ObservableOnSubscribe<View> {
override fun subscribe(emitter: ObservableEmitter<View>) {
if (Looper.getMainLooper() != Looper.myLooper()) {
throw IllegalStateException("Must be called from the main thread. Was: " + Thread.currentThread())
}
view.setOnClickListener {
if (!emitter.isDisposed) {
emitter.onNext(view)
}
}
}
}
/**
* A one-argument action. 点击事件转发接口
* first argument type
*
* @param #
*/
interface Action1 {
fun onClick(t: View)
}
}