美文网首页
Rxjava2实现防抖点击事件

Rxjava2实现防抖点击事件

作者: el小法老_13b2 | 来源:发表于2018-10-25 10:20 被阅读0次

    为防止用户在数据加载的时候接连点击按钮造成数据混乱,我们可以用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并未被观察者接收)

    源码
    源码

    相关文章

      网友评论

          本文标题:Rxjava2实现防抖点击事件

          本文链接:https://www.haomeiwen.com/subject/gwrqtqtx.html