java半球最多_多是东半球最全的RxJava使用场景小结
1、Scheduler线程切换html
这样的场景经常会在“后台线程取数据,主线程展现”的模式中看见java
Observable.just(1, 2, 3, 4)
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(new Action1() {
@Override
public void call(Integer number) {
Log.d(tag, "number:" + number);
}
});
2、使用debounce作textSearchgit
用简单的话讲就是当N个结点发生的时间太靠近(即发生的时间差小于设定的值T),debounce就会本身主动过滤掉前N-1个结点。github
比方在作百度地址联想的时候,可以使用debounce下降频繁的网络请求。避免每输入(删除)一个字就作一次联想数组
RxTextView.textChangeEvents(inputEditText)
.debounce(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@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()));
}
});
3、Retrofit结合RxJava作网络请求框架
这里不做具体解释。具体的介绍可以看扔物线的这篇文章,对RxJava的入门者有很是大的启示。
当中也讲到了RxJava和Retrofit怎样结合来实现更简洁的代码缓存
4、RxJava取代EventBus进行数据传递:RxBus
注意:RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果。这篇文章把RxBus讲的比較具体。
5、使用combineLatest合并近期N个结点好比:注冊的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注冊button。Observable _emailChangeObservable = RxTextView.textChanges(_email).skip(1);
Observable _passwordChangeObservable = RxTextView.textChanges(_password).skip(1);
Observable _numberChangeObservable = RxTextView.textChanges(_number).skip(1);
Observable.combineLatest(_emailChangeObservable,
_passwordChangeObservable,
_numberChangeObservable,
new Func3() {
@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() {
@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);
}
});
6、使用merge合并两个数据源。网络
好比一组数据来自网络,一组数据来自文件。需要合并两组数据一块儿展现。app
Observable.merge(getDataFromFile(), getDataFromNet())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@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!")
});
7、使用concat和first作缓存框架
依次检查memory、disk和network中是否存在数据。不论什么一步一旦发现数据后面的操做都不运行。ide
Observable memory = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
if (memoryCache != null) {
subscriber.onNext(memoryCache);
} else {
subscriber.onCompleted();
}
}
});
Observable disk = Observable.create(new Observable.OnSubscribe() {
@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 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);
});
8、使用timer作定时操做。当有“x秒后运行y操做”相似的需求的时候。想到使用timer
好比:2秒后输出日志“hello world”,而后结束。
Observable.timer(2, TimeUnit.SECONDS)
.subscribe(new Observer() {
@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");
}
});
9、使用interval作周期性操做。当有“每隔xx秒后运行yy操做”相似的需求的时候,想到使用interval 好比:每隔2秒输出日志“helloworld”。
Observable.interval(2, TimeUnit.SECONDS)
.subscribe(new Observer() {
@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");
}
});
10、使用throttleFirst防止button反复点击
ps:debounce也能达到相同的效果
RxView.clicks(button)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Observer() {
@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");
}
});
11、使用schedulePeriodically作轮询请求
Observable.create(new Observable.OnSubscribe() {
@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() {
@Override
public void call(String s) {
log.d("polling….”));
}
})
12、RxJava进行数组、list的遍历
String[] names = {"Tom", "Lily", "Alisa", "Sheldon", "Bill"};
Observable
.from(names)
.subscribe(new Action1() {
@Override
public void call(String name) {
log.d(name);
}
});
十3、解决嵌套回调(callback hell)问题
NetworkService.getToken("username", "password")
.flatMap(s -> NetworkService.getMessage(s))
.subscribe(s -> {
System.out.println("message: " + s);
})
十4、响应式的界面
比方勾选了某个checkbox,本身主动更新相应的preference
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);
Preference checked = rxPreferences.getBoolean("checked", true);
CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);
RxCompoundButton.checkedChanges(checkBox)
.subscribe(checked.asAction());
最后。由于我的能力有限,文章不免有疏漏之处,假设您有不论什么疑议。请让我知道。谢谢!本文所有的样例已经上传到github上
致谢:这篇文章的绝大多数样例是从这里总结的。还有部分样例来自这里。
对做者的无私贡献表示感谢。
java半球最多_多是东半球最全的RxJava使用场景小结相关推荐
- 可能是东半球最全的RxJava使用场景小结
http://blog.csdn.net/theone10211024/article/details/50435325
- 天津java工资_天津java工资怎么样,天津java工资最多到多少,天津java工资待遇有多少...
天津java工资怎么样,天津java工资最多到多少,天津java工资待遇有多少 首页 > java > 天津java工资怎么样 作者:镀金池 发布时间:2017-11-23 14:39 ...
- 学习笔记:Java 并发编程①_基础知识入门
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...
- 学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...
- Java虚拟机最多支持多少个线程的探讨
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 来源 | jb51.net/article/49087.htm McGovernTheory ...
- JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系
文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...
- Java计算时间差_传统的SimpleDateFormat类
Java计算时间差_传统的SimpleDateFormat类 SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd ...
- JAVA异常使用_每个人都曾用过、但未必都用得好
JAVA异常使用_每个人都曾用过.但未必都用得好 一.抛出异常 vs. 返回错误代码 有人说"Well, an exception is a goto.",但也有人言"m ...
- 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝
生鲜配送ERP系统_对商品模块数据模型与界面设计的思考及简要分析[Java 开源版]杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝 一直在研究与改造自己的生鲜配送系统,越来越觉得后 ...
最新文章
- 解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)
- python 样本均值t检验_假设检验与单样本T检验(上)
- QT的QGLFunctions类的使用
- 与40mhz信道不兼容设置_为什么面包板不适合高频电路
- np.random的随机数函数
- 接口上加@feignclient还有实现类_类接口的实现及应用
- tensorflow实现LeNet-5模型
- python mro算法_Python MRO C3算法实现
- 集合之Collection接口AND Iterator迭代器 AND 增强for AND 泛型
- 计算机辅助翻译与笔译的关系,机器翻译 vs 计算机辅助翻译:有什么区别?
- CentOS:Jmeter5.2.1+Ant1.10.12+jmeter.results.shanhe.me.xsl(亲测可用)
- 四级词汇——不择手段记单词new
- java 用户留存率_Java后台实现日留存率,求解!
- C 程序设计语言——第七章练习题
- php开发考勤系统、OA系统简易版Mysql数据库设计
- Window 10未连接到互联网
- 央视“解禁”播《V字别动队》 电影全面解析
- 什么镜头最适合拍风景_风景用什么镜头好
- 软考知识点---07计算机网络
- 金蝶eas系统服务器连接失败,金蝶EAS服务器安装错误
热门文章
- 讲座:与迷茫为友的成长(贺利坚老师,烟台大学)——完整讲座PPT,精彩与动画媲美
- 大家一起读Java美文
- c语言expand函数,练习 3-3 编写函数expand(s1, s2) (C语言 + 详细注释)
- C语言编写Python包,使用C语言编写Python扩展1——Hello World
- cortex a7 a53_金杯海星A7面包车报价最小商用车2.98万值得拥有
- 工程行业数字化采购商城平台提供科学采购决策,提高采购管理水平
- 30s解决联想小新Air14指纹解锁失效问题
- 分布式专题(2)- 分布式 Java通信
- 高一数学知识点复习:命题及其关系、充分条件
- 一个小台灯 之 微信小程序开发日志