资料
RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发
-
Rxjava项目地址: https://github.com/ReactiveX/Rxjava
-
Rxjava经典资料:https://github.com/lzyzsd/Awesome-RxJava
-
操作符说明 :http://reactivex.io/documentation/operators/merge.html
RxJava 1 与 RxJava 2对比
-
RxJava 2x 不再支持 null 值,如果传入一个null会抛出NullPointerException
-
Observable.just(null)(不支持)
-
RxJava2 所有的函数接口(Function/Action/Consumer)均设计为可抛出Exception,自己去解决编译异常需要转换问题。
-
RxJava1 中Observable不能很好支持背压,在RxJava2 中将Oberservable实现成不支持背压,而新增Flowable 来支持背压。
Observable与Flowable如何选取?
什么时候用 Observable:
一般处理最大不超过1000条数据,并且几乎不会出现内存溢出
如果是鼠标事件,频率不超过1000 Hz,基本上不会背压;
什么时候用 Flowable:
处理以某种方式产生超过10K的元素;
文件读取与分析,例如 读取指定行数的请求;网络IO流;
有很多的阻塞和/或 基于拉取的数据源,但是又想得到一个响应式非阻塞接口的。
适用于上游是阻塞的,下游是非阻塞的情况。
背压
概念:上游的发送事件与下游处理的事件不一致。就是生产者(被观察者)的生产速度大于消费者(观察者)消费速度从而导致的问题,生产速度与消费者速度的一个比值。
为什么要设计背压呢?
为了解决上游发送事件和下游处理事件速度不一致的问题我们需要一个策略能让 下游告诉上游,下游的处理能力是怎样的,这两处不同就是为了解决这个问题。
举一个简单点的例子:
如果被观察者快速发送消息,但是观察者处理消息的很缓慢,如果没有特定的流(Flow)控制,就会导致大量消息积压占用系统资源,最终导致十分缓慢。当发生大量的网络请求时,网速比较慢的情况下由于不能及时处理请求,会导致请求积压下来,这就是我们要面临的背压。
背压四种策略:
BackpressureStrategy参数的含义:
-
BackpressureStrategy.ERROR:若上游发送事件速度超出下游处理事件能力,且事件缓存池已满,则抛出异常。
-
BackpressureStrategy.BUFFER:若上游发送事件速度超出下游处理能力,则把事件存储起来等待下游处理。(阻塞式队列)
-
BackpressureStrategy.DROP:若上游发送事件速度超出下游处理能力,事件缓存池满了后将之后发送的事件丢弃。
-
BackpressureStrategy.LATEST:若上有发送时间速度超出下游处理能力,则只存储最新的128个事件。
Flowable
@Test
public void testFlowable() {
Flowable.create(
new FlowableOnSubscribe<Integer>() {
@Override
public void subscribe(FlowableEmitter<Integer> e) throws Exception {
for (int i = 0; i < 1000000000; i++) {
e.onNext(i);
}
}
},
BackpressureStrategy.BUFFER
).subscribe(new Subscriber<Integer>() {
@Override
public void onSubscribe(Subscription s) {
}
@Override
public void onNext(Integer integer) {
System.out.println("处理 "+integer);
try {
Thread.currentThread().sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
});
}
运行后并没有输出任何结果,这是因为使用Flowable的时候必须在onSubscribe中设置最大的处理能力。
在onSubscribe方法中添加:
s.request(10);
输出结果:
处理 0
处理 1
处理 2
处理 3
处理 4
处理 5
处理 6
处理 7
处理 8
处理 9