线程切换
- subscribeOn - 切换上游线程,但仅调用的第一次生效
- observeOn - 切换下游线程,调用一次切换一次
上下游在同一线程(默认)
- 单个事件源:上游onNext一次进入阻塞,下游处理一次,处理完毕上游继续onNext,如此循环直至onComplete或onError
- 多个事件源:如zip(),按zip事件源参数顺序执行
上下游不在同一线程
- 单个事件源:上游只管onNext,下游只管处理
- 当事件源生产过快,而消费者消费事件速度慢:RxJava1中,内存数据超过128个时将会抛出MissingBackpressureException;而在RxJava2中并不会报错,数据会一直放到内存中,直到发生OOM
取消回调避免内存泄漏
- Observable:通过下游onSubscribe传给我们的Disposable对象,调用disposable.dispose()切断上游传过来的事件
- Flowable:通过下游onSubscribe传给我们的Subscription对象,
调用subscription.cancel()切断上游传过来的事件
新引入的Flowable
- BackpressureStrategy.ERROR
- 上下游同步:
没有subscription.request(requestCount)或requestCount<emitter.onNext时,会回调onError:MissingBackpressureException(但不是抛错,程序会继续执行,上游会继续发送) - 上下游异步:
上游会有个缓存128个onNext数据的“水缸”,超出128未处理时,同样会回调onError:MissingBackpressureException,下游可以动态调用subscription.request(requestCount)来分步处理“水缸”中的数据 - BackpressureStrategy.BUFFER
和Observable类似 - BackpressureStrategy.DROP
“水缸”满了,其余事件统统不要 - BackpressureStrategy.LATEST
“水缸”满了,除了最后一个事件外其余事件统统不要一个事件