Rxjava2.0在android中的应用

本来想弄一篇操作符集锦的文章,但是思来想去感觉单单把操作符弄出来走一遍意义不大,还是要举一些实际应用中例子,这样才来得更直观。
其实android开发中很多时候都可以转变一下思路,用rxjava的思想去做一些业务功能,从而让自己的代码显得更简洁更具有扩展性。
在这里不得不提到RxBinding 这个第三方库了,这个三方库可以说把rxjava的思想在Android开发中发挥得淋漓尽致。虽然现在已经有了4.0的版本,但是我们重在学习它的rxjava思想是怎么在安卓中体现的,所以还是以它的经典版本2.0来做讲解。
首先导入RxBinding2.0:

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

导入这个后就不需要再导入rxjava和rxandroid了,rxbingding自带了这两个依赖。

OK,开始我们愉快的学习之旅吧
一. 监听单个TextView或EditText文字变化
        //内部其实就是进行了addTextChangedListener封装
        RxTextView.textChanges(mUserNameEt).subscribe(new Consumer<CharSequence>() {
            @Override
            public void accept(CharSequence charSequence) throws Exception {
                //charSequence为mUserNameEt每次文字变化后的字符串
            }
        });
二. 监听多个TextView或EditText文字变化
        Observable<CharSequence> mUserNameEtObservable = RxTextView.textChanges(mUserNameEt);
        Observable<CharSequence> mUserPwdEtObservable = RxTextView.textChanges(mUserPwdEt);
        //最高支持9个observable同时监听
        Observable.combineLatest(mUserNameEtObservable, mUserPwdEtObservable, new BiFunction<CharSequence, CharSequence, Boolean>() {
            @Override
            public Boolean apply(CharSequence charSequence, CharSequence charSequence2) throws Exception {
                    //任何一个控件的文字变化了,都会回调到这个方法
                    //很适合做那种登录时用户名密码都输入的情况下,登录btn才可点击的效果
                    return false;
            }
        }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                
            }
        });
三. 防止重复点击
      //300ms内只有一次点击响应
      //debounce(防抖动)用到了ScheduledThreadPoolExecutor线程池执行延迟线程来做控制,如果在300s内连续点击,最新的点击
    //会把之前的点击线程计划取消掉,总是执行最后一次点击,还有一个点要注意,如果不指定
    //observeOn(AndroidSchedulers.mainthread()),accept()是执行在线程池维护的异步线程的
       RxView.clicks(mClearContent).debounce(300, TimeUnit.MILLISECONDS).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {

            }
        });
四. 控制操作时间间隔
     // 原理跟上面的一样,用在监控EditText的文字输入上,可以很好的做输入框联想搜索功能,这样
    //只会在700ms内输入最后的字之后700ms没操作的情况下开启搜索
        RxTextView.textChanges(mUserNameEt).debounce(700, TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<CharSequence>() {
                    @Override
                    public void accept(CharSequence charSequence) throws Exception {
                        log("do search");
                    }
                });
五. 接口轮询,轮询操作
      //一看就知道内部又是利用了ScheduledThreadPoolExecutor线程池做的
        Observable.interval(2, 2, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) throws Exception {
                log("interval");
            }
        });
六. 接口轮询,轮询操作
       // 延时操作,可用在开屏页等,基本关于延时的都用到了ScheduledThreadPoolExecutor,注意下游观察者是在异步线程执行
        Observable.timer(2, TimeUnit.SECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        log("timer");
                    }
                });
七. rxPermissions

用于申请动态权限,导入依赖

    implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'

使用:

      //看着是不是非常简单,但是其实里面做了大量的工作,它new了一个不可见的fragment来把该做的事情都做了,并没有绕过申请权限的任何什么步骤,在性能上要自己权衡
      RxPermissions rxPermissions = new RxPermissions(this);
      rxPermissions.request(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                if(aBoolean){
                    // 成功
                }else {
                    // 失败
                }
            }
        });

好了,暂时先讲这么多,关于rxbinding还有很多其他的有趣实用的功能,看完以上这些例子相信给你很多启发吧,原来我们日常开发中很多都可以用到rxjava的思想,其实确实是,rxjava的牛逼之处就是把这些看似没有关联的东西通过代码把他表达出来了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356