参考资料
什么是响应式编程
响应式编程是一种基于异步数据(事件)流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一条流合并为一条新的流。
响应式编程的一个关键概念是事件。事件可以被等待,可以触发过程,也可以触发其它事件。事件是唯一的以合适的方式将我们的现实世界映射到我们的软件中:如果屋里太热了我们就打开一扇窗户。同样的,当我们的天气app从服务端获取到新的天气数据后,我们需要更新app上展示天气信息的UI;汽车上的车道偏移系统探测到车辆偏移了正常路线就会提醒驾驶者纠正,就是是响应事件。
订阅与背压
操作符
- Create
主要用于产生一个 Observable 被观察者对象 - Map
处理数据流,可改变数据类型 - Zip
zip 用于合并事件,两两配对,也就意味着,最终配对出的 Observable 发射事件数目只和少的那个相同。 - Concat
将两个Observable产生并发出的数据按Observable顺序合并成一个Observable - FlatMap
FlatMap可以把一个 Observable 转换为N个其他类型的 Observable,然后再把这些分散的 Observables装进一个单一的发射器 Observable。但需要注意的是,flatMap 并不能保证事件的顺序,如果需要保证,需要用到ConcatMap。 - concatMap
concatMap 与 FlatMap 的唯一区别就是 concatMap 保证了顺序 - distinct
是简单的去重 - Filter
过滤器,可以接受一个参数,让其过滤掉不符合我们条件的值 - buffer
buffer 操作符接受两个参数,buffer(count,skip),作用是将 Observable 中的数据按 skip (步长) 分成最大不超过 count 进行分组分发数据。 - timer
timer 一个定时任务。在 1.x 中它还可以执行间隔逻辑,但在 2.x 中此功能被交给了 interval。需要注意的是,timer 和 interval 均默认在新线程。 - interval
interval 操作符用于间隔时间执行某个操作,其接受三个参数,分别是第一次发送延迟,间隔时间,时间单位。 - doOnNext
其实觉得 doOnNext 应该不算一个操作符,但考虑到其常用性,还是记录下。它的作用是让订阅者在接收到数据之前干点有意思的事情。假如我们在获取到数据之前想先保存一下它。 - skip
skip 作用就和字面意思一样,接受一个 long 型参数 count ,代表跳过 count 个数目开始接收。 - take
take,接受一个 long 型参数 count ,代表至多接收 count 个数据。 - just
就是一个简单的发射器依次调用 onNext() 方法。// Observable.just(“1”, “2”, “3”) - Single
Single 只会接收一个参数,而 SingleObserver 只会调用 onError() 或者 onSuccess()。 - debounce
去除发送频率过快的项,防止过快点击// Observable.debounce(500, TimeUnit.MILLISECONDS) - defer
每次订阅都会创建一个新的 Observable,并且如果没有被订阅,就不会产生新的 Observable。// 推迟创建?懒汉式?啥作用? - last
last 操作符仅取出可观察到的最后一个值,或者是满足某些条件的最后一项。 - merge
作用是把多个 Observable 结合起来,接受可变参数,也支持迭代器集合。注意它和 concat 的区别在于,不用等到 发射器 A 发送完所有的事件再进行发射器 B 的发送,而是根据时间顺序进行分发。 - reduce
字面意思为减少合并,作用就是将多个数据源进行合并处理,总结果再分发,提高效率。 - scan
scan 操作符作用和上面的 reduce 一致,唯一区别是 reduce 是个只追求结果,而 scan 会始终如一地把每一个步骤都输出。(每一次合并操作的结果都进行分发) - window
将数据进行分组,并将每组数据生成一个Observable,最终形成N个Observable进行分别订阅分发。
补充
RxJava2内存泄露解决:
CompositeDisposable comDisposable = new CompositeDisposable();
comDisposable.add(disposable);
comDisposable.dispose();
RxBinding
RxAndroid
RxBus