RxJava使用场景小结
一、Scheduler线程切换
这种场景经常会在“后台线程取数据,主线程展示”的模式中看见
- Observable.just(1, 2, 3, 4)
- .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
- .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
- .subscribe(new Action1<Integer>() {
- @Override
- public void call(Integer number) {
- Log.d(tag, "number:" + number);
- }
- });
二、使用debounce做textSearch
用简单的话讲就是当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会自动过滤掉前N-1个结点。
比如在做百度地址联想的时候,可以使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想
- RxTextView.textChangeEvents(inputEditText)
- .debounce(400, TimeUnit.MILLISECONDS)
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Observer<TextViewTextChangeEvent>() {
- @Override
- public void onCompleted() {
- log.d("onComplete");
- }
- @Override
- public void onError(Throwable e) {
- log.d("Error");
- }
- @Override
- public void onNext(TextViewTextChangeEvent onTextChangeEvent) {
- log.d(format("Searching for %s", onTextChangeEvent.text().toString()));
- }
- });
三、Retrofit结合RxJava做网络请求框架
这里不作详解,具体的介绍可以看扔物线的这篇文章,对RxJava的入门者有很大的启发。其中也讲到了RxJava和Retrofit如何结合来实现更简洁的代码
四、RxJava代替EventBus进行数据传递:RxBus
注意:RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果。这篇文章把RxBus讲的比较详细。
五、使用combineLatest合并最近N个结点
例如:注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。
- Observable<CharSequence> _emailChangeObservable = RxTextView.textChanges(_email).skip(1);
- Observable<CharSequence> _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);
- Observable<CharSequence> _numberChangeObservable = RxTextView.textChanges(_number).skip(1);
- Observable.combineLatest(_emailChangeObservable,
- _passwordChangeObservable,
- _numberChangeObservable,
- new Func3<CharSequence, CharSequence, CharSequence, Boolean>() {
- @Override
- public Boolean call(CharSequence newEmail,
- CharSequence newPassword,
- CharSequence newNumber) {
- Log.d("xiayong",newEmail+" "+newPassword+" "+newNumber);
- boolean emailValid = !isEmpty(newEmail) &&
- EMAIL_ADDRESS.matcher(newEmail).matches();
- if (!emailValid) {
- _email.setError("Invalid Email!");
- }
- boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;
- if (!passValid) {
- _password.setError("Invalid Password!");
- }
- boolean numValid = !isEmpty(newNumber);
- if (numValid) {
- int num = Integer.parseInt(newNumber.toString());
- numValid = num > 0 && num <= 100;
- }
- if (!numValid) {
- _number.setError("Invalid Number!");
- }
- return emailValid && passValid && numValid;
- }
- })//
- .subscribe(new Observer<Boolean>() {
- @Override
- public void onCompleted() {
- log.d("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.d("Error");
- }
- @Override
- public void onNext(Boolean formValid) {
- _btnValidIndicator.setEnabled(formValid);
- }
- });
六、使用merge合并两个数据源。
例如一组数据来自网络,一组数据来自文件,需要合并两组数据一起展示。
- Observable.merge(getDataFromFile(), getDataFromNet())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Subscriber<String>() {
- @Override
- public void onCompleted() {
- log.d("done loading all data");
- }
- @Override
- public void onError(Throwable e) {
- log.d("error");
- }
- @Override
- public void onNext(String data) {
- log.d("all merged data will pass here one by one!")
- });
七、使用concat和first做缓存
依次检查memory、disk和network中是否存在数据,任何一步一旦发现数据后面的操作都不执行。
- Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(Subscriber<? super String> subscriber) {
- 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 = rxPreferences.getString("cache").get();
- if (!TextUtils.isEmpty(cachePref)) {
- subscriber.onNext(cachePref);
- } else {
- subscriber.onCompleted();
- }
- }
- });
- Observable<String> network = Observable.just("network");
- //依次检查memory、disk、network
- Observable.concat(memory, disk, network)
- .first()
- .subscribeOn(Schedulers.newThread())
- .subscribe(s -> {
- memoryCache = "memory";
- System.out.println("--------------subscribe: " + s);
- });
八、使用timer做定时操作。当有“x秒后执行y操作”类似的需求的时候,想到使用timer
例如:2秒后输出日志“hello world”,然后结束。
- Observable.timer(2, TimeUnit.SECONDS)
- .subscribe(new Observer<Long>() {
- @Override
- public void onCompleted() {
- log.d ("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.e("error");
- }
- @Override
- public void onNext(Long number) {
- log.d ("hello world");
- }
- });
九、使用interval做周期性操作。当有“每隔xx秒后执行yy操作”类似的需求的时候,想到使用interval
例如:每隔2秒输出日志“helloworld”。
- Observable.interval(2, TimeUnit.SECONDS)
- .subscribe(new Observer<Long>() {
- @Override
- public void onCompleted() {
- log.d ("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.e("error");
- }
- @Override
- public void onNext(Long number) {
- log.d ("hello world");
- }
- });
十、使用throttleFirst防止按钮重复点击
ps:debounce也能达到同样的效果
- RxView.clicks(button)
- .throttleFirst(1, TimeUnit.SECONDS)
- .subscribe(new Observer<Object>() {
- @Override
- public void onCompleted() {
- log.d ("completed");
- }
- @Override
- public void onError(Throwable e) {
- log.e("error");
- }
- @Override
- public void onNext(Object o) {
- log.d("button clicked");
- }
- });
十一、使用schedulePeriodically做轮询请求
- Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(final Subscriber<? super String> observer) {
- Schedulers.newThread().createWorker()
- .schedulePeriodically(new Action0() {
- @Override
- public void call() {
- observer.onNext(doNetworkCallAndGetStringResult());
- }
- }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);
- }
- }).subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- log.d("polling….”));
- }
- })
十二、RxJava进行数组、list的遍历
- String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};
- Observable
- .from(names)
- .subscribe(new Action1<String>() {
- @Override
- public void call(String name) {
- log.d(name);
- }
- });
十三、解决嵌套回调(callback hell)问题
- NetworkService.getToken("username", "password")
- .flatMap(s -> NetworkService.getMessage(s))
- .subscribe(s -> {
- System.out.println("message: " + s);
- })
十四、响应式的界面
比如勾选了某个checkbox,自动更新对应的preference
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
- RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);
- Preference<Boolean> checked = rxPreferences.getBoolean("checked", true);
- CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);
- RxCompoundButton.checkedChanges(checkBox)
- .subscribe(checked.asAction());
最后,由于个人能力有限,文章难免有疏漏之处,如果您有任何疑议,请让我知道,谢谢!本文所有的例子已经上传到github上
致谢:这篇文章的绝大多数例子是从这里总结的,还有部分例子来自这里。对作者的无私贡献表示感谢!
RxJava使用场景小结的更多相关文章
- 可能是东半球最全的RxJava使用场景小结
一.Scheduler线程切换 这样的场景常常会在"后台线程取数据,主线程展示"的模式中看见 Observable.just(1, 2, 3, 4) .subscribeOn(Sc ...
- Data URI 应用场景小结
Data URI scheme 在前端开发中是个常用的技术,通常会在 CSS 设置背景图中用到.比如在 Google 的首页就有用到: Data URI scheme 简称 Data URI,经常会被 ...
- RxJava 复杂场景 Schedulers调度
参考: https://blog.piasy.com/2016/10/14/Complex-RxJava-2-scheduler/ 以Zip为例,学习Schedulers的线程调度 要求: * cre ...
- Nginx也应用场景小结
Nginx简介 Nginx一是一款轻量级的.高性能的HTTP和反向代理服务器, 具有很高的稳定性和支持热部署.模块扩展也很容易.当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器 ...
- Nginx---应用场景小结
Nginx介绍 Nginx一是一款轻量级的.高性能的HTTP.反向代理服务器,具有很高的稳定性.支持热部署.模块扩展也非常容易.Nginx采取了分阶段资源分配技术,处理静态文件和无缓存的反向代理加 ...
- 【腾讯Bugly干货分享】基于RxJava的一种MVP实现
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...
- 关于 RxJava 技术介绍
Awesome-RxJava RxJava resources Blog 给 Android 开发者的 RxJava 详解 -强烈推荐 扔物线的文章 讲解非常详细 NotRxJava懒人专用指南 -这 ...
- 开发 Material Design+RxJava+Retrofit+MVP App 参考资料
前言 在开发一个基于 Material Design+RxJava+Retrofit+MVP 框架的 App 过程中学习的资料整理 —— 由G军仔分享 这里记录了我开发 大象 项目时,所学习的 ...
- 我的Android进阶之旅------>RxJava学习资料汇总
在响应式编程中,应该牢记以下两点: everything is a stream(一切皆流) don't break the chain(不要打断链式结构) 记住,可观测序列就像一条河,它们是流动的. ...
随机推荐
- 2016030203 - 首次将内容推送到github中
参考网址:http://www.cnblogs.com/plinx/archive/2013/04/08/3009159.html 和当你在你的github上创建repository后的提示信息如下 ...
- 转:阿里开源Mysql分布式中间件:Cobar
原文来自于:http://hualong.iteye.com/blog/2102798 这几天研究了下Cobar, Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成 ...
- 《Braid》碎片式台词
谁见到过风? 你没有,我也没有. 但当树儿低下头, 便是风儿经过时. 便是风儿穿过的时候. 但当树叶微微摇首, 你没有,我也没有. 谁见到过风? 二.时间与宽恕 1.提姆要出发了!他要去寻找并救出公主 ...
- 关于IN-LIST迭代
IN-list iterator (IN-list迭代) 字段有索引,in里有多少个值就执行多少次索引扫描.不管值是否在字段里存在~ SQL> create table t1 as select ...
- poj1849
不难发现每条边最多走两次,最少走一次也就是我们要在所有走两次的边中选两条从根出发没有公共边的路径使路径上的边少走一次显然我们找的是最长路径
- 单独启动tomcat
原料: jdk-1_5_0_13-windows-i586-p.exe apache-tomcat-5.5.25.zip 安装jdk,路径为:C:\Program Files\Java\jdk1.5. ...
- HDU-4972 A simple dynamic programming problem
http://acm.hdu.edu.cn/showproblem.php?pid=4972 ++和+1还是有区别的,不可大意. A simple dynamic programming proble ...
- [转]33 useful Keyboard Shortcuts for Run commond
原文: http://www.shortcutworld.com/en/win/Run-command.html 1. Calling Run CommandWin + r ...
- UnderStand Perspective Rasterization, SV_POSITION(gl_FragCoord) to Pixel, SV mean Systems Value
Shader "UnderStandPRR" { Properties { _MainTex ("Texture", 2D) = "white&quo ...
- javascript:void到底是个什么?
一般都是用作 实现 如下功能,当点击一个超链接的时候,不想出发超链接自带的动作,而触发自定义的js方法,一般与onclick 一起出现.如果不写void(0)点击超链接时候虽然调用js方法,但是也会出 ...