文档章节

RxJava 常用的几种方法 。

名字有人用了123
 名字有人用了123
发布于 2016/07/14 11:17
字数 1562
阅读 1266
收藏 26
需要引入的依赖包,这个依赖包依赖于RxJava和RxAndroid,会自动引入进来,也可以自己手动单独的引入。
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
/**
 * Scheduler线程切换
 * <p>
 * 这种场景经常会在“后台线程取数据,主线程展示”的模式中看见
 */
private void rj1() {
    Observable.just(1, 2, 3, 4)
            .subscribeOn(Schedulers.io())//指定subscribe()发生在IO线程
            .observeOn(AndroidSchedulers.mainThread())//指定Subscriber回调发生在主线程
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    KLog.d(integer);
                }
            });
}
/**
 * 使用debounce做textSearch
 * <p>
 * 当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会自动过滤掉前N-1个结点。
 * <p>
 * 比如在做百度地址联想的时候,可以使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想
 * <p>
 * Toolbar使用RxToolbar监听点击事件; Snackbar使用RxSnackbar监听;
 * EditText使用RxTextView监听; 其余使用RxView监听.
 */
private void rj2(TextView textView) {
    RxTextView.textChangeEvents(textView)
            .debounce(400, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<TextViewTextChangeEvent>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {
                    KLog.d(textViewTextChangeEvent.toString());
                }
            });
}
/**
 * 使用combineLatest合并最近N个结点
 * <p>
 * 例如:注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。
 */
private void rj3(TextView tvEmail, TextView tvPassword, TextView tvNumber) {
    Observable<CharSequence> email = RxTextView.textChanges(tvEmail).skip(1);
    Observable<CharSequence> password = RxTextView.textChanges(tvPassword).skip(1);
    Observable<CharSequence> number = RxTextView.textChanges(tvNumber).skip(1);
    Observable.combineLatest(email, password, number, new Func3<CharSequence, CharSequence, CharSequence, Boolean>() {
        @Override
        public Boolean call(CharSequence email, CharSequence password, CharSequence number) {
            boolean emailValid = !StrUtils.isBlank(email.toString());
            boolean passwordValid = !StrUtils.isBlank(password.toString());
            boolean numberValid = !StrUtils.isBlank(number.toString());

            if (!emailValid) {
                KLog.d("emailValid error");
            }
            if (!passwordValid) {
                KLog.d("passwordValid error");
            }
            if (!numberValid) {
                KLog.d("numberValid error");
            }

            return emailValid && passwordValid && numberValid;
        }
    }).subscribe(new Subscriber<Boolean>() {
        @Override
        public void onCompleted() {
            KLog.d("onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            KLog.d(e.toString());
        }

        @Override
        public void onNext(Boolean o) {
            KLog.d(o);
        }
    });
}
/**
 * 使用merge合并两个数据源。
 * <p>
 * 界面需要等到多个接口并发取完数据,再更新
 * 例如一组数据来自网络,一组数据来自文件,需要合并两组数据一起展示。
 */
private void rj4() {
    Observable.merge(HttpAchieve.getHttp(""), HttpAchieve.getHttp(""))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<IdCode>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(IdCode idCode) {
                    KLog.d("onNext");
                }
            });
}
/**
 * 使用concat和first做缓存
 * <p>
 * 依次检查memory、disk和network中是否存在数据,任何一步一旦发现数据后面的操作都不执行。
 */
private void rj5() {
    Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            String memoryCache = "";//这里只是声明一个变量,你可以自己做检查内存是否存在
            if (memoryCache != null) {
                subscriber.onNext(memoryCache);
            } else {
                subscriber.onCompleted();
            }
        }
    });
    Observable<String> disk = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            String cachePref = "";//cachePref =rxPreferences.getString("cache").get(); //这里获取SD卡数据
            if (StrUtils.isBlank(cachePref)) {
                subscriber.onCompleted();
            } else {
                subscriber.onNext(cachePref);
            }
        }
    });
    Observable<String> network = Observable.just("network");
    //一次检查memory, disk, network
    Observable.concat(memory, disk, network)
            .first()
            .subscribeOn(Schedulers.newThread())
            .subscribe(s -> {
                KLog.d(s);
            });
}
/**
 * 使用timer做定时操作。当有“x秒后执行y操作”类似的需求的时候,想到使用timer
 * <p>
 * 例如:2秒后输出日志“hello world”,然后结束。
 */
private void rj6() {
    Observable.timer(2, TimeUnit.SECONDS)
            .subscribe(new Subscriber<Long>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(Long aLong) {
                    KLog.d(aLong);
                }
            });
}
/**
 * 使用interval做周期性操作。当有“每隔xx秒后执行yy操作”类似的需求的时候,想到使用interval
 * <p>
 * 例如:每隔2秒输出日志“helloworld”。
 */
private void rj7() {
    Observable.interval(2, TimeUnit.SECONDS)
            .subscribe(new Subscriber<Long>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(Long aLong) {
                    KLog.d(aLong);
                }
            });
}

/**
 * 使用throttleFirst防止按钮重复点击
 * <p>
 * debounce也能达到同样的效果
 */
private void rj8(Button button) {
    RxView.clicks(button)
            .throttleFirst(1, TimeUnit.SECONDS)
            .subscribe(new Subscriber<Object>() {
                @Override
                public void onCompleted() {
                    KLog.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    KLog.d(e.toString());
                }

                @Override
                public void onNext(Object o) {
                    KLog.d(o);
                }
            });
}

/**
 * 使用schedulePeriodically做轮询请求
 */
private void rj9() {
    Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            Schedulers.newThread().createWorker().schedulePeriodically(new Action0() {
                @Override
                public void call() {
                    subscriber.onNext("");
                }
            }, 0, 1000, TimeUnit.MILLISECONDS);//0初始间隔,1000轮询间隔,时间模式
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {

        }
    });
}

/**
 * RxJava进行数组、list的遍历
 */
private void rj10() {
    String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};
    Observable.from(names)
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    KLog.d(s);
                }
            });
}

/**
 * 一个接口的请求依赖另一个API请求返回的数据
 * <p>
 * 举个例子,我们经常在需要登陆之后,根据拿到的token去获取消息列表。
 */
private void rj11(String idCode) {
    Api.getInstance().movieService.login(idCode)//请求用户的数据
            .flatMap(s ->
                    Api.getInstance().movieService.login(idCode)//通过用户的数据请求消息列表
            )
            .subscribe(s -> {
                KLog.d(s);
            });
}

/**
 * 循环输出元素,过滤不满足条件的,最多输出5个结果,输出之后做额外的操作
 */
private void rj12() {
    String[] strings = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
    Observable.just(strings)
            .flatMap(new Func1<String[], Observable<String>>() {
                @Override
                public Observable<String> call(String[] strings) {
                    return Observable.from(strings);
                }
            })
            .filter(new Func1<String, Boolean>() { //过滤掉不等于空的
                @Override
                public Boolean call(String s) {
                    return !StrUtils.isBlank(s);
                }
            })
            .take(5) // 只输出5次
            .doOnNext(new Action1<String>() {
                @Override
                public void call(String s) {
                    KLog.d("在这里做额外的操作");
                }
            })
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    KLog.d(s);
                }
            });
}

/**
 * 按钮的长按时间监听
 */
private void rj13(Button button) {
    RxView.longClicks(button)
            .subscribe(new Action1<Void>() {
                @Override
                public void call(Void aVoid) {
                    KLog.d("call");
                }
            });
}

/**
 * ListView 的点击事件、长按事件处理
 */
private void rj14(ListView listView) {
    //item点击事件
    RxAdapterView.itemClicks(listView)
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    KLog.d("ListView点击事件");
                }
            });
}

/**
 * ListView 的点击事件、长按事件处理
 */
private void rj15(ListView listView) {
    //item 长按事件
    RxAdapterView.itemLongClicks(listView)
            .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    KLog.d("ListView点击事件");
                }
            });
}

/**
 * 响应式编程,选中后做响应的处理,
 * <p>
 * 用户登录界面,勾选通用协议,登录按钮就高亮显示
 */
private void rj16(CheckBox checkBox) {
    RxCompoundButton.checkedChanges(checkBox)
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    KLog.d("在这里设置Button可点击高亮显示");
                }
            });
}


自己从网上搜索和整理总结的,还有其他的用法可以在评论中告诉我。

 

© 著作权归作者所有

名字有人用了123
粉丝 3
博文 8
码字总数 7635
作品 0
杭州
程序员
私信 提问
0章 RxJava2课程目录介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30379689/article/details/83389064 导言 RxJava在工作中和面试中已经成为各个项目开发的必选框架,掌握这...

Hensen_
2018/10/26
0
0
《RxJava 2.x 实战》

我最近写了一本书《RxJava 2.x 实战》。 该书由电子工业出版社出版,目前已经在淘宝、京东、当当、亚马逊等各大电商平台上进行销售或预售。 天猫电子工业出版社旗舰店 https://detail.tmall...

fengzhizi715
2018/04/28
0
0
RxJava 沉思录(一):你认为 RxJava 真的好用吗

本人两年前第一次接触 RxJava,和大多数初学者一样,看的第一篇 RxJava 入门文章是扔物线写的《给 Android 开发者的 RxJava 详解》,这篇文章流传之广,相信几乎所有学习 RxJava 的开发者都阅...

掘金官方
2018/09/07
0
0
【Android学习】使用聚合数据的接口进行的RxAndroid学习

最近学习RxJava,一直在看大神的文章。 RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java V......

夜晚晚
2016/11/30
279
0
Android技能树 - Rxjava源码(1) 之 初步结构

前言 以前写相关的RxJava的文章比较少,也就下面二篇: 目需求讨论 — 手把手带你写RxPermission RxJava小考题 -- Rxjava源码分析(一) 用了这么久的RxJava,所以想要做个总结,所以打算也写一...

青蛙要fly
02/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部