序
rvjava 一个令人欲罢不能的东西呐~说明一下rxjava是基于观察者模式做的东西,至于观察着模式是啥,可以上网搜,下面回顾的第一张图就是标准的观察者模式。
另外其实这个文章是在rxjava1的时候就写了一点点,现在都用rxjava2了那就基于rxjava2吧~
回顾
观察者模式在Java里有两种实现,一种是完全手动写的一种是调用Java里面的api,先回顾一下传统Java的做法
完全手动写的
api版
RxJava2
配置
需要在build.gradle引入rxjava和rxandroid,rxandroid主要是负责Android的线程切换的。
https://github.com/ReactiveX/RxAndroid
https://github.com/ReactiveX/RxJava
例如
背压什么的先忽略吧,上流发送速度远快于下流处理速度的情景一般项目遇不到。
概念
Observable ( 被观察者 ) / Observer ( 观察者 )
说起被观察者 观察者,因为这两个词好接近,反正我一开始没记住哪个是哪个,这点还是需要下功夫背一背。Observable(被观察者)是属于上流发送指令的,而Observer ( 观察者 ) 是负责接收指令的。
subscribeOn() 指定的就是发射事件的线程,observerOn 指定的就是订阅者接收事件的线程。
使用
最简单的操作
rxjava2支持链式操作所以还能这样
Creat
很简单 就是生成一个 Obserable对象
Just
为了缩减下面的实例代码先讲这个,相当于一个简单的发射器调用onNext()的简写
最多10个
Observer的简化写法
也是为了缩减下面的实例代码先讲这个
有时候不需要所有的就能这样写
例如我只要onNext的 相当省事有木有
其它的可参考
Map 数据转换
map就是数据转换咯,先把上流的数据转换合适的对象再传给下流。
Zip 配对合并
就是每次两个上流各取出一个再转换为下流,两个上流一定有配对关系,上流a取一个,上流b就取一个,两个上流发送的数量要相同,多出来的不会发送到下流。
Concat & Merge连接合并
把两个上流连起来发送 concat是保证上流a发完才到上流b 而merge不保证
运行结果
ConcatMap&FlatMap 发送的每个数据转为单独的Observable
ConcatMap&FlatMap把上流发送的每个数据独立再包装为一个新的上流,
假如上流数据为 s1 s2 s3 ,包装后的新上流为k1 k2 k3,ConcatMap保证执行顺序为 s1 ->s1的k1 k2 k3 ->s2->s2的k1 k2 k3 而FlatMap不保证。
Filter 过滤器
|
|
Distinct 去掉重复项
|
|
Buffer 下流一次取多值
|
|
FromIterable发射列表
|
|
Timer 延迟执行
此处是延迟2秒执行,注意timer默认在新线程执行
Interval 定时循环执行
|
|
Skip 跳过某次数执行
|
|
Take 只执行前几次
//只发送前两次
Debounce 过滤频率过快
|
|
Defer 为每个观察者创建一个新的Observable
直到有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable,Defer 操作符会一直等待直到有观察者订阅它,然后它使用Observable工厂方法生成一个 Observable。它对每个观察者都这样做,因此尽管每个订阅者都以为自己订阅的是同一个 Observable,事实上每个订阅者获取的是它们自己的单独的数据序列。
Single只发送一个参数
|
|
Last取最后一项
|
|
Scan&Reduce把上一项的结果传给第下次操作
scan:每次操作之后先把数据输出,然后在调用scan的回调函数进行第二次操作
reduce:把所有的操作都操作完成之后在调用一次观察者,把数据一次性输出
输出结果