用RxJava和RxBinding发射用户点击

本文介绍了如何在Android应用中利用RxJava和RxBinding库来响应用户点击事件。通过RxBinding的RxView等API,可以方便地将Android控件的事件转化为Observable数据流,实现响应式编程。示例代码展示了如何用Flowable监听TextView的点击事件,并提供了完整代码的GitHub链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在初步应用RxJava时发现,网上资料中Observable的创建例子主要使用create/just/from,都是将现在已有的数据序列整理为一个发射器,而我们最常见的应用却是现在没有数据序列,等待将来数据序列的到达,比如等待用户点击或输入,或等待网络来包,也即,我们其实需要一种手动的发射器,在数据到达后用来发送这些数据。那么怎样创建这种发射器呢?查询资料后发现有几个途径,下面用点击textview来示例。


第一类,使用RxBinding提供的RxView等直接封装输入控件,这是特别为Android定制的,自然也是最简单方便的:

    private void rxview_click() {
        RxView.clicks(textView).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o){
                append_str(" "+((int) (Math.random() * 10)));
            }
        });
    }

第二类,使用Observable.create (new ObservableOnSubscribe ()) 来获取一个 emitter 发射器,并将这个发射器挂入 textview 的点击监听事件中,这样 textview 被点击时触发这个 emitter 发射器就可以了:

    private void observable_emitter() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull final ObservableEmitter<Integer> e) throws Exception {

                e.setCancellable(new Cancellable() {
                    //when emitter send cancel, textview remove listener?
                    @Override
                    public void cancel() throws Exception {
                        textView.setOnClickListener(null);
                    }
                });

                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        e.onNext((int) (Math.random() * 10));
                    }
                });
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                append_str(" " + integer);
            }
        });
    }

使用Flowable来替代Observable也是一样的:

    private void flowable_emitter() {
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull final FlowableEmitter<Integer> e) throws Exception {
                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        e.onNext((int) (Math.random() * 10));
                    }
                });
            }
        }, BackpressureStrategy.MISSING).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {

                append_str(" " + integer);
            }
        });
    }

第三类,也非常的简单清晰的,使用 PushlishSubject

    private void publish_subject() {
        final PublishSubject<Integer> publishSubject = PublishSubject.create();
        publishSubject.subscribe(new Consumer<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {

                append_str(" " + integer);
            }
        });

        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                publishSubject.onNext((int) (Math.random() * 10));
            }
        });
    }
推荐一篇关于 publishSubject 的极简明清晰解释: https://blog.mindorks.com/understanding-rxjava-subject-publish-replay-behavior-and-async-subject-224d663d452f 

上面所有例子的完整可以运行代码放在:https://github.com/maxyou/PublishSubjectDemo


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值