背压
背压在计算机系统中指网络拥塞信息逆流通过。在rxjava中理解为:被观察者发送消息太快以至于它的操作符或者订阅者不能及时处理相关的消息,从而操作消息的阻塞现象。
在RxJava2.0中官方,推出了Flowable 和Subscriber用来支持背压,同样的去除了Observable对背压的支持,对的就像你上面看到的,Observable不再支持背压了,即使阻塞崩溃也不会抛出MissingBackpressureException
Flowable的用法吧。
Flowable.create(FlowableOnSubscribe<T> source, BackpressureStrategy mode)
FlowableOnSubscribe很好理解就是一个就是Flowable的一个被观察者源,而BackpressureStrategy就是Flowable提供的背压策略
背压策略
- MISSING:
如果流的速度无法保持同步,可能会抛出MissingBackpressureException或IllegalStateException。 - BUFFER
上游不断的发出onNext请求,直到下游处理完,也就是和Observable一样了,缓存池无限大,最后直到程序崩溃 - ERROR
会在下游跟不上速度时抛出MissingBackpressureException。 - DROP
会在下游跟不上速度时把onNext的值丢弃。 - LATEST
会一直保留最新的onNext的值,直到被下游消费掉。
链式调用
变换/操作符
- 所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。比如要修改Observable对象,把字符串改为整型或者加上另一串字符等等。
- 操作符就是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。
- 变换操作符API
- from():
Observable.from()方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber:
Observable.from("url1", "url2", "url3")
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
- map():改变observable对象发出的数据类型。
map操作符有趣的一点是它不必返回Observable对象返回的类型,我们可以使用map操作符返回一个发出新的数据类型的observable对象。
比如上面的例子中,subscriber如果并不关心返回的字符串,而是想要字符串的hash值,则可以这样写:
Observable.just("Hello, world!") //输入类型 String
.map(new Func1<String, Integer>() { //String ---> Integer
@Override
public Integer call(String s) { //参数类型 String
return s.hashCode(); //返回类型 Integer
}
})
.subscribe(new Action1<Integer>() { //由map()返回的Observable对象调用
@Override
public void call(Integer i) { //参数类型 Integer(即上面的返回类型)
System.out.println(Integer.toString(i));
}
});
这里出现了一个叫做 Func1 的类。它和 Action1 非常相似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1 和 Action 的区别在于,** Func1 包装的是有返回值的方法**。另外,和 ActionX 一样, FuncX 也有多个,用于不同参数个数的方法。(用于输入与输出参数数据类型的变换)
- flatMap():
flatMap() 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。但需要注意,和 map() 不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。map()解决的是一对一的变换,flatMap()解决的是一对多的变换。
flatMap()的原理
- 使用传入的事件对象创建一个 Observable 对象;
- 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;