java接口防抖_Rxjava2实现防抖点击事件

本文介绍了如何使用RxJava2实现按钮点击事件的防抖功能,以防止用户频繁点击导致数据混乱。通过创建接口、封装代理点击事件方法、创建观察者和订阅过程,最终达到在规定时间内屏蔽重复点击的效果。
摘要由CSDN通过智能技术生成

为防止用户在数据加载的时候接连点击按钮造成数据混乱,我们可以用RxJava的形式实现按钮的点击事件,使用户在你规定的时间内再次点击按钮无效。

实现

1.首先引入RxJava2

implementation "io.reactivex.rxjava2:rxjava:2.1.17"

implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

2.创建一个接口,里面设置一个方法用于点击事件时触发

public interface MyClickListener {

void onClick(View view);

}

3.封装一个proxyOnClickListener()方法,此方法用于代替之前的点击事件方法

public void proxyOnClickListener(int seconds, final View view, final MyClickListener myClickListener)

//seconds:表示点击按钮的时间间隔,在此间隔内点击按钮会使点击无效

//view:传进来的控件

//myClickListener:我们自己构建的接口,需实现其中的onClick(View view)方法,表示点击时触发的事件

4.创建ObserveOnSubscribe对象,此对象是Obsarveble创建时需要传入的对象

ObservableOnSubscribe subscribe = new ObservableOnSubscribe() {

@Override

public void subscribe(final ObservableEmitter emitter) throws Exception {

view.setOnClickListener(new View.OnClickListener() {//view是我们传进来的view参数

@Override

public void onClick(View v) {

emitter.onNext(view);//将view发送给观察者,在观察者中实现我们接口中的onClick()方法

}

});

}

};

5.创建观察者Observer

Observer observer = new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(View view) {

myClickListener.onClick(view);//view是被观察者传过来的view,在这里调用接口中的方法

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

};

6.观察

Observable

.create(subscribe)//这是我们创建的ObserveOnSubscribe对象

.throttleFirst(seconds,TimeUnit.SECONDS)//这句很关键,这是RxJava中的操作符,在规定时间内观察者不在接收被观察者发送的事件

.subscribe(observer);

7.完整的proxyOnClickListener方法

public void proxyOnClickListener(int seconds, final View view, final MyClickListener myClickListener){

ObservableOnSubscribe subscribe = new ObservableOnSubscribe() {

@Override

public void subscribe(final ObservableEmitter emitter) throws Exception {

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

emitter.onNext(view);

}

});

}

};

Observer observer = new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(View view) {

myClickListener.onClick(view);

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

};

Observable

.create(subscribe)

.throttleFirst(seconds,TimeUnit.SECONDS)

.subscribe(observer);

}

8.调用

proxyOnClickListener(2, button, new MyClickListener() {

@Override

public void onClick(View view) {

Log.d(TAG, "onClick: ");

}

});

当我们点击按钮时会发现,在你第一次点击按钮的2秒内再次点击按钮,并不会打印log日志,说明我们的点击事件是无效的(其实OnClickListener中的onClick()方法是调用了,不过在其中 emitter.onNext(view)发送的view并未被观察者接收)

源码

源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值