欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RxView学习及实现按钮防抖功能

程序员文章站 2022-05-14 15:55:04
...

RxView

RxBinding是是一组开源库,可将Android的中各类UI控件的动作事件转换为RxJava中的数据流。使用RxBinding,以RxJava观察者模式来处理UI事件.RxView是RxBinding中的一个组件。

 

引入依赖

注意:RxBinding包中包含RxJava的内容,所以就无需再添加RxJava的依赖了。

dependencies {
    ......
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
   }

代码分析

1. RxView.clicks(查看视图)

        通过源码可发现其内部封装了View.OnClickListener点击监听,调用点击方法返回一个可观测对象,每当点击这个查看的时候,该可观测对象就会发射一个事件,随即调用onNext()方法,可观察到对应的观察者就可以通过onNext()回调响应此次点击事件使用RxBinding还可做到点击防抖的效果来看代码。:

addDisposable(RxView.clicks(btnClick) 
       .throttleFirst(2, TimeUnit.SECONDS)
       .subscribe(o -> { Log.e("rx_binding_test", "clicks:点击了按钮:两秒内防抖");}));

      throttleFirst(long windowDuration,TimeUnit unit),设置一定时间内只响应首次(throttleFirst)或者末次(throttleLast)的点击事件.windowDuration为防抖时间,unit为时间单位。调用这个方法便可防止短时间内对的重复点击,本例中设置的防抖时间为2秒。

 

2. RxView.longClicks(查看视图) 

   内部封装了View.OnLongClickListener长按监听,原理同上。

addDisposable(RxView.longClicks(btnClick)
        .subscribe(o -> {
            Log.e("rx_binding_test", "longClicks:长点击了按钮");
        }));

 

防抖实现

       在实际开发中,我们经常需要经常遇到一个问题,假设有一个按钮,这个按钮是请求网络,或者弹窗某一个状态栏,当用户(特别是光速手)点击过快的时候,会请求多次网络,或者显示两次状态栏一方面会导致频繁的请求,导致网络资源浪费;另一方面会导致显示出现问题,可能会被测试提错误。

      这个时候,我们希望可以有一种按钮防抖机制,来帮我们解决这类办法。

tvRfbtn.setOnClickListener(v -> {
    if (!CommonUtils.isNetWorkAvailable(NewMessageActivity.this)) {
        DialogNewUtils.getInstance().showDialogToast(NewMessageActivity.this, "网络出问题了,请检查网络");
    } else {
        mPageNumber = 1;
        initData();
    }
});

       tvRfbtn是一个TestView,点击这个控件,在网络正常的情况下,我们会进行初始化,请求网络,获取数据,但是当用户点击过快当情况下,很容易请求多次,进行资源浪费,这里我用RxView改写,代码如下:

RxView.clicks(tvRfbtn).throttleFirst(MineConstants.WINDOW_DURATION, TimeUnit.SECONDS).subscribe(new Consumer<Object>() {

    @Override
    public void accept(Object o) throws Exception {
        if (!CommonUtils.isNetWorkAvailable(NewMessageActivity.this)) {
            DialogNewUtils.getInstance().showDialogToast(NewMessageActivity.this, "网络出问题了,请检查网络");
        } else {
            mPageNumber = 1;
            initData();
        }
    }
});

       在这里,我加入了防抖机制,用户在1秒内点击只会触发1次,不会出现1秒内疯狂点击3次,请求3次的情况。

相关标签: F防抖机制