RxJava 平常使用
本文转载自:
http://blog.csdn.net/theone10211024/article/details/50435325
一、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());
RxJava 平常使用的更多相关文章
- RxJava学习入门
RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...
- Android中使用反应式编程RxJava
GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...
- MVP+Dagger2+Rxjava+Retrofit+GreenDao 小应用,包含新闻、图片、视频3个大模块,代码整洁干练
练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了.不管是文件(Java.xml. ...
- android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码
Android精选源码 微信打飞机 android进度设置加载效果源码 Android新手引导库EasyGuide MVP-好看又好用的句子迷客户端 XFloatView 一个简易的悬浮窗实现方案 a ...
- Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- 【腾讯Bugly干货分享】基于RxJava的一种MVP实现
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...
随机推荐
- ApplePay高调入华,教你在app里上线ApplePay
ApplePay在中国上线后,就有许多线上app前后脚加入了对其的接入支持,个人比较喜欢的ENJOY也抢在首批接入了ApplePay应用内支付.本文将分享作者的接入经验. ApplePay是苹果公 ...
- Socket 之 原理与编程基础
一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...
- Code Jam 2008 APAC local onsites Problem C. Millionaire —— 概率DP
题意: 你有X元钱,进行M轮赌博游戏.每一轮可以将所持的任意一部分钱作为赌注(赌注为0元表示这一轮不押),赌注可以是小数的,不是一定要整数.每一轮 赢的概率为P,赢了赌注翻倍,输了赌注就没了.如果你最 ...
- Clairewd’s message
Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...
- java适配器模式随笔记
今天学习了一下java中的适配器模式,在这里做个记录,方便以后查看 什么是适配器,适配就是连接源到目标的中间件,简单的例子就是我们的港水货手机充电器是大三角,我们想要在大陆正常使用我们需要一个转接充电 ...
- [JavaEE] WEB-INF有关的目录路径总结
1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html 3. ...
- CSS3: border-radius边框圆角详解
border-radius 基本语法: border-radius : none | <length>{1,4} [/ <length>{1,4} ]? 取值范围: <l ...
- 重构3-Pull Up Method(方法上移)
上移方法(Pull Up Method)重构是将方法向继承链上层迁移的过程.用于一个方法被多个实现者使用时 public abstract class Vehicle { // other metho ...
- 前端开发调试工具控制台之console命令详解
控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示 ...
- Oracle基础<5>--触发器
一.触发器 触发器是当特定事件出现时自动执行的代码块.比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录.触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的. ...