Android架构RxJava—— RxView 控件事件与原理

前言

自从用上RxJava后彻底迷上Rx系列响应式编程,从本篇开始一起来学习一下Rx套餐之一的RxBinding。RxBinding是什么?它是一组开源库,来自大神Jake Wharton之手,可将Android中各类UI控件的动作事件转换为RxJava中的数据流。也就是说使用RxBinding,我们就可以以RxJava的形式来处理UI事件。本篇主要讲解其中RxView的相关View事件如何绑定。 RxBinding中主要包含RxView、RxTextView、RxAdapterView、RxCompoundButton等等。由于全写一起篇幅太长,本文主要讲RxView。

RxView

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

引入依赖

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

implementation 'com.jakewharton.rxbinding2:rxbinding:2.2.0'

代码分析

RxView.clicks(查看视图)

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

        RxView.clicks(button)
            .throttleFirst(2, TimeUnit.SECONDS)
            .compose(
                RxPermissions(this@MainActivity)
                    .ensure(
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.CAMERA
                    )
            ).subscribe {
                Toast.makeText(this@MainActivity, "你好!", Toast.LENGTH_SHORT).show()
            }

补充:

compose:组成
ensure():类似request()方法
subscribe:订阅

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

RxJava RxBinding RxView 控件事件 MD使用案例

public class RxBindingActivity extends RxFragmentActivity {
    private static final String[] ARRAY = {"包青天", "白乾涛", "baiqiantao", "bqt", "RxBinding", "RxView", "1", "2", "3", "4", "5",};
    private ImageView iv1, iv2, iv3, iv4, iv5;
    private EditText et1, et2, et3;
    private Button btn;
    private CheckBox cb;
    private ListView listView;
    private int type;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxbinding);
        iv1 = findViewById(R.id.iv1);
        iv2 = findViewById(R.id.iv2);
        iv3 = findViewById(R.id.iv3);
        iv4 = findViewById(R.id.iv4);
        iv5 = findViewById(R.id.iv5);
        btn = findViewById(R.id.btn);
        et1 = findViewById(R.id.et1);
        et2 = findViewById(R.id.et2);
        et3 = findViewById(R.id.et3);
        cb = findViewById(R.id.cb);
        listView = findViewById(R.id.lv);
        listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, Arrays.asList(ARRAY)));
        type = getIntent().getIntExtra("type", 0);
        log("type=" + type);
        switch (type) {
            case 0:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值