RxJava入门之路(一)
RxJava接触过蛮长时间了,但是让我说个所以然来还是说不出来,归根结底还是还是理解不够深刻,趁着年底这个时候争取写个系列出来给自己的学习做个记录
注意区分RxJava1.0和2.0的区别,以下默认是在2.0的基础上做的测试
先来理解几个概念:
1、Observable : 字面意思可观察的,被观察者,也就是事件的发生者
2、Observer:观察者,也就是事件的接受者
3、subscribe():两者产生订阅关系,需要注意一点的是 observable.subscribe(observer),感觉像是被观察者订阅了观察者,与常理不符,为什么这么设计呢?我估计是为了链式调用吧。。
一、最简单的使用方式:
1 Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.i(TAG, "onSubscribe: ");
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: "+integer);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: "+e.getMessage());
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete: complete");
}
});
1、onNext()可以多次发送事件,onComplete()发送一次,多次调用不会报错,onError()发送一次,多次调用会报错,不可和onComplete()共存
2、调用onComplete()或者onError()后,观察者也无法接受到onNext()
3、Disposable(2.0新增),当调用了dispose()后,观察者就无法接受到事件了
二、Cold Observable和Hot Observable
Cold Observable:只有当订阅者订阅的时候,数据流才开始发送,并且每个订阅者订阅的时候都会独立执行一遍数据流的发送(create(),just()....)
Hot Observable :不管有没有订阅者订阅,一旦创建,就开始发送数据流
publish转化:
ConnectableObservable<Long> ob= Observable.interval(200, TimeUnit.MILLISECONDS).publish();//转化成Cold Observable
ob.connect();//开始发送数据流
如果不调用connnect(),不会发送数据流,一旦调用,就会创建一个subscription并订阅到原Observable,将接受的数据转发给订阅者。
connect()与disConnect()
1.0 connect() 返回Subscription
2.0 connect() 返回Disposable
//注意区分要释放哪个
//释放s,则代表中断数据传输,再次连接则重新发送数据
//释放d1或者d2,则代表取消注册,数据已然在传输
public void doSubscribe(View v){
s= ob.connect();
//public final void subscribe(Observer<? super T> observer) {} 无返回值,无法取消注册
d1= ob.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.i(TAG, "onNext: first============"+aLong);
}
});
d2=ob.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.i(TAG, "accept: second=========="+aLong);
}
});
}
RefCount
Observable<Long> ob= Observable.interval(200, TimeUnit.MILLISECONDS).publish().refCount();
如果有订阅者就会发送数据流,无订阅数据流即停止,再次订阅重新开始发送(可能会和Cold Observable混淆,注意此处每个订阅者接受到的数据是相同的)
Reply
ConnectableObservable<Long> ob= Observable.interval(200, TimeUnit.MILLISECONDS).replay();
ob.connect();
当和源 Observable 链接后,开始收集数据。当有 Observer 订阅的时候,就把收集到的数据线发给 Observer。然后和其他 Observer 同时接受数据
可以同时设置收集数据的个数及时间
Cache
Observable<Long> ob= Observable.interval(200, TimeUnit.MILLISECONDS).take(5).cache();//只有当订阅者订阅后才开始发送数据
与Reply类似,订阅者全部取消后也不会停止发送。
RxJava入门之路(一)的更多相关文章
- RxJava入门之路(二)
收集一下能够避免背压的运算符 sample(500, TimeUnit.MILLISECONDS) 定期收集数据,并发送最后一个 throttleFirst(500,TimeUnit.MILLISE ...
- 小猪的Android入门之路 Day 3 - part 3
小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...
- 小猪的Android入门之路 Day 7 part 2
小猪的Android入门之路 Day 7 part 2 Android的数据存储与訪问之--SharedPreferences(保存偏好參数) ---转载请注明出处:coder-pig 本节引言: 在 ...
- 小猪的Android入门之路 day 1
小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显 ...
- 小猪的Android入门之路 Day 4 - part 1
小猪的Android入门之路 Day 4 - part 1 Android事件处理机制之--基于监听的事件处理机制 本节引言: 在開始本个章节前,我们先回想下,如今我们已经知道了android的一些相 ...
- wii 入门之路--fatt
wii 入门之路--fatt system menu:系统界面,开机进入后,显示很多应用,4.1用IOS60. Channel:理解为界面中的软件应用和游戏. IOS:IOS(Input Output ...
- RxJava入门优秀博客推荐
RxJava用了快半年了,现在越来越离不开这个库,从使用到逐渐接触它的背后实现,突然想写点什么关于RxJava的内容.在酝酿如何组织内容的时候,就去看看自己关于RxJava的收藏,发现满满的干货! 1 ...
- 史上最浅显易懂的RxJava入门教程
RxJava是一个神奇的框架,用法很简单,但内部实现有点复杂,代码逻辑有点绕.我读源码时,确实有点似懂非懂的感觉.网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾 ...
- 清晰易懂的RxJava入门实践
导入 我相信大家肯定对ReactiveX 和 RxJava 都不陌生,因为现在只要是和技术相关的网站,博客都会随处见到介绍ReactiveX和RxJava的文章. ReactiveX Reactive ...
随机推荐
- BUPT复试专题—二进制数(2012)
https://www.nowcoder.com/practice/103dd589fed14457a673c613d8de3841?tpId=67&tqId=29634&tPage= ...
- windows10 開機失敗,且按F8無法進入安全模式
windows10 開機失敗,且按F8無法進入安全模式: 在cmd視窗下: bcdedit set {default} bootmenupolicy legacy 重啟,再按F8試一試吧! To En ...
- [Testing] JavaScript Mocking Fundamentals
Ensure Functions are Called Correctly with JavaScript Mocks Often when writing JavaScript tests and ...
- HTML--比较实用的小例子
常用的前端实例: 1略 2.在网页商城中的图片当我们把鼠标放上去之后,图片会显示一个有颜色的外边框,图片某一部分的字体的颜色并发生改变 鼠标放上去之前 鼠标放上去之后: 实现的代码: <!DOC ...
- HDU2084_数塔【简单题】【数塔】
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 【转载】Http协议与TCP协议简单理解
在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...
- Screen 状态栏配置
http://havee.me/linux/2010-08/screen-status-bar.html Screen 状态栏配置 GNU 的 screen 是一个很好的工具.如果需要经常或者大量的登 ...
- HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA
状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j] ...
- 【BZOJ】1007 水平可见直线
[分析] 维护一个下凸包. 首先依照斜率来从小到大排序. 考虑斜率同样的,肯定仅仅能选截距大的,把截距小的给筛掉. 然后用栈来维护下凸包.先压入前两条直线. 然后对于每一条直线i,设栈中上一条直线p= ...
- java zip压缩优化版 解决压缩后文件一直被占用无法删除
最近进行zip操作,从网上找到一个处理方法,但是经过试验存在一些bug,主要是文件流的申明存在问题,导致jvm一直占用文件而不释放,特意把自己修改的发出来,已备记录 import java.io.Bu ...