Rxjava2实现防抖点击事件

为防止用户在数据加载的时候接连点击按钮造成数据混乱,我们可以用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<View> subscribe = new ObservableOnSubscribe<View>() {
            @Override
            public void subscribe(final ObservableEmitter<View> emitter) throws Exception {
                view.setOnClickListener(new View.OnClickListener() {//view是我们传进来的view参数
                    @Override
                    public void onClick(View v) {
                        emitter.onNext(view);//将view发送给观察者,在观察者中实现我们接口中的onClick()方法
                    }
                });
            }
        };

5.创建观察者Observer

Observer<View> observer = new Observer<View>() {
            @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<View> subscribe = new ObservableOnSubscribe<View>() {
            @Override
            public void subscribe(final ObservableEmitter<View> emitter) throws Exception {
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        emitter.onNext(view);
                    }
                });
            }
        };

        Observer<View> observer = new Observer<View>() {
            @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并未被观察者接收)

源码
源码

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 文:小魔的影子 今天是第二轮每天500字第16天,第一轮时自我要较高,搞得不敢下笔,然后就如想到的一样得了拖延癌,...
    小魔的影子阅读 400评论 0 1
  • 12月27日上午,实验学校西校区思品组针对“期末复习”进行了2017年的最后一次集体教研活动。 首...
    思品王立峰阅读 390评论 0 0
  • 前几天学习了ViewPager作为引导页和Tab的使用方法。后来也有根据不同的使用情况改用Fragment作为Ta...
    陈利健阅读 68,564评论 19 46
  • 南区小广场拐角处的石台后面有一个垃圾桶,李雨棠揉乱手中的纸片扔进那个黑洞洞的入口。昏暗的路灯下是关中独有的薄薄雾霾...
    鎏柏阅读 298评论 1 0
  • 《HotSpot实战》深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,...
    b3c1a9535cad阅读 1,086评论 0 1

友情链接更多精彩内容