首先了解 响应式编程 和 观察者模式
响应式编程
响应式编程是一种面向数据流、通过异步的方式来构建事务关系的编程模型。
不同于命令式编程环境中,a=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。
Excel就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的函数,而包含公式的单元格的值会依据其他单元格的值的变化而变化。
“事务的关系”是响应式编程的核心理念
这种关系不是类的依赖关系,而是业务逻辑上的关系。比如APP初始化中,SDK初始化,数据库初始化,登陆接口,他们共同被跳转页面业务所依赖。但是他们三个本身并没有关联。这也只是业务之间较为简单的关系,实际上,根据我们的需求App端会产生出许多业务之间错综复杂的关系。
“数据流”和“异步”是实现这个核心理念的关键。
Gradle
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.7'
与RxJava1的区别
1 RxJava2x 不再支持 null 值,如果传入一个null会抛出 NullPointerException
2 Observable.just(null)(不支持)
3 RxJava2 所有的函数接口(Function/Action/Consumer)均设计为可抛出Exception,
自己去解决编译异常需要转换问题。
4 RxJava1 中Observable不能很好支持背压,在RxJava2 中将Oberservable实现成不支持背压,而新增Flowable 来支持背压。
操作符
create
just
fromArray
empty
区分使用Observable与Flowable
Observable 一般处理<=1000条数据,并且几乎不会出现内存溢出
如鼠标事件(click),频率不超过1000 Hz,基本上不会背压;
Flowable 处理以某种方式产生>10K的元素;文件读取与分析,
如读取指定行数的请求;
网络IO流;
有很多的阻塞() 或 基于拉取的数据源,但是又想得到一个响应式非阻塞接口的。
BackpressureStrategy参数的含义
BackpressureStrategy.ERROR:若上游发送事件速度超出下游处理事件能力,且事件缓存池已满,则抛出异常
//阻塞时队列
BackpressureStrategy.BUFFER:若上游发送事件速度超出下游处理能力,则把事件存储起来等待下游处理
BackpressureStrategy.DROP:若上游发送事件速度超出下游处理能力,事件缓存池满了后将之后发送的事件丢弃
BackpressureStrategy.LATEST:若上有发送时间速度超出下游处理能力,则只存储最新的128个事件