一.gradle的配置
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
二.本文章把 Observable、Flowable、Competaable、Singlable….被观察者看出上游,subscribe(xxx),xxx观察者看成下游;
如图:上下游通过subscribe连接起来,这样就是一个基本的rxjava的结构
三.XXXXXEmitter
Emitter就是发送器的提示
在:
//创建上游被观察者的最基础方式
xxx.create(emitter->{
emitter.onNext();
emitter.onNext();
emitter.complete();
emitter.error();
})
发射器(emitter)就是就是把上游的事件发射给下游
四.Disposable
翻译:一次性,可抛弃的
其实就是下游观察者返回的其中一个参数,他可以使用dispose()方法终止上下游连接
也可以当成是切断了水管,不过就算你切断了下游的水管,上游依然会执行
四.线程的调度
4.1 切换线程使用的函数
函数名字 | 说明 |
---|---|
subscribeOn | 只能第一次生效 |
oberveOn | 每次都生效,线程的切换 |
4.2 线程的枚举与效果
线程名称 | 说明 |
---|---|
Schedules.newThread() | 新线程 |
Schedule.IO | io操作的线程 |
Schedule.computaion | cpu计算多的线程 |
AndroidSchedule.mainThread() | 安卓主线程 |
4.3 RxJava 内置了一个容器ComposuteDisposable 可以通过add()放置disposable,通过可以在销毁的时候使用clear的方法切除所有上游的开关
五.Map: rxjava中变换操作符,就上游的事件作出转换
注意: 所有的xxMap 方法都带有”转变”的意思
六.操作符:flapMap与concatMap
两者都是可以将上游的事件,经过flapMap或者concatMap 变换成新的事件
实例:注册后的结果,做完登录的参数,继续进行
两者的差别:flatMap 对于onNext转变过来的事件是无序的,而后者是有序的
七:操作符Zip : 就是多个obserble 发送的事件结合在一起:
与六的操作符不过,flapMap和concatMap是有前后次序,而zip是并列打包一起的
注意点一:打包的事件按照zip打包事件中onNext最少的计算;
注意点二:关于上游事件的执行顺序问题:
1.同一线程,先别前面的事件缓存在队列,然后再遍历合并
2.不同的线程,分别取出后合并
注意点三:在不同线程的时候,当一个执行了complate,所有的上游事件都会停止执行
实践:
取出多个同学的信息然后组成表
八.backpressure:背压
所有的Backpressure其实就是为了控制流量,避免上游过多的请求,造成OOM
8.1 同一线程中,上游直接给下游,不会oom
8.2 不同线程中,由于异步,需要把上游的请求发送队列中,下游来不及处理就操作oom
8.3 出现的问题
Q:如何避免OOM
A:以下方式
- 8.3.1 使用filter过滤,过滤上游的事件
- 8.3.2 使用sample(2,TimeUnit)方法降低发送的频率
- 8.3.3 上游降低发送事件的速度
九.Flowable
其实就是Observable 的升级麻烦版
9.1 在下游把disposable -> Subscription
该方法增添了request方法,用于增加下游处理事件的能力
在用一个线程的时候,BackpressureStrategy是什么都没问题
当不同线程的时候,直接抛MissingbacjpressureException
是因为下游的subscription默认没有request能力
可以使用subscription.request(Long.valueMax())方法给予
9.2 在create 方法中增添了BackpressureStrategy
使用Flowable的时候上下游不均衡的时候发送MissingBackpressureException
枚举类型 | 发送上下游不均衡是的策略 |
---|---|
BackpressureStrategy.ERROR | 直接抛异常 |
BackpressureStrategy.BUFFER | 上游无限队列,而默认上游是128个 |
BackpressureStrategy.DROP | 下游不接受,直接丢弃 |
BackpressureStrategy.LATEST | 下游不接受,直接丢弃,保留最后一个 |
我们需要
- onBackpressureBuffer()
- onBackpressureDrop()
- onBackpressurelast()
指定策略
- 9.3 使用Flowable.xxxx(): 如:interval方法创建flowable事件的时候
为报missingbackpressureexception
十.关于Subscription 与FlowableEmitter
FlowableEmitter#requested():可以获得下游的处理能力
Subscription#request(xx):可以增加处理的能力