思想:响应式编程,事件流编程,可读性高,扩展性高,维护性
ObservableEmitter 发射器
dispose() 并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件.下游不在接收
subscribeOn() 指定的是上游发送事件的线程,第一次有效
observeOn() 指定的是下游接收事件的线程.最后一次有效
RxJava中已经内置了一个容器CompositeDisposable【使用的是数组】, 每当我们得到一个Disposable时就调用CompositeDisposable.add()将它添加到容器中, 在退出的时候, 调用CompositeDisposable.clear()即可切断所有的水管
创建操作符
create 直接创建操作符
just 将参数传递到观察者钟(将数据发送到主线程钟执行,读取文件等操作)
fromArray 将数组等发送到观察者(代替for循环)
empty 上游不发送任何事件,只支持object泛型,只能接受到onComple事件(用于在子线程中获取数据)
range 递归添加数( range(1,8)类似于从1发送到8)
变换操作符
map 变换,将原始数据进行一个变换,继续传递到观察者, 需要一个function(通过一个地址,在map中转换成文件,然后传递到观察者,读取文件)
flatMap 再次发射,将创建得资源,重新创建一个被观察者,然后再将新的被观察者发送到观察者(不排序)
concatMap 排序得flatMap,类似于function中所有得return每次只要等上一个被观察者执行完之后才会执行下一个
groupBy 类似于过滤,把不同的数据进行分组
Buffer 分次进行处理, buffer(10) 等于先处理十个 数据 然后在处理十个
过滤操作符
filter 过滤操作符,是否过滤 true/false
take 定时器[interval]得基础上添加 take(8) 等于执行8次
distinct 过滤掉重复的操作,值相同被过滤
elementAt 指定输出某个下标,找不到得情况下输出默认
条件型操作符(最终结果为Boolean类型)
all 判断数据中是否存在某个数等【类似于 if 得操作】判断为true才到观察者中去
contain 是否包含 【contain("123")】
isEmpty
any 和 all 相反,全部为true才会发送true【类似于if中得&&】
合并型操作符(两个或者多个被观察者合并)
startWith 执行两个被观察者,先执行startWith中的参数的那个被观察者
concatWith 跟startWith是相反
concat 最多存四个被观察者,多个被观察者合并成一个被观察者,按顺序执行【一个被观察者执行完后在下一个】
merge 跟concat一样,但是不按顺序,并列执行【】
zip 将多个被观察者自定义合并数据(最多9个),两个被观察者的数据是要对应,多了的会被忽略
异常处理操作符
onErrReturn 拦截异常,返回指定数据然后继续到观察者并中断后续的事件,(使用throw会崩溃,需要使用e.onError();作用在onErrorReturn中处理异常,可以返回指定的值
onErrorResumeReturn 在拦截中onErrorResumeReturn可以重新创建一个被观察者,继续发送数据到观察者
onExceptionResumeReturn 可以拦截throw抛出的异常,然后接受到异常继续发送事件
retry 在retry中返回false代表不重试,true为一直重试【重新执行全部】(设置次数的时候,会执行一次。重试次数)
线程切换
subscribeOn 被观察者使用的线程【只是第一次设置有效】
onserveOn 观察者使用的线程【每设置一次,切换一次】
schedulers.io(),schedulers.newThread (),AndroidSchedulers.mainThread()
同步跟异步执行的区别
同步是一次执行,一次通知被观察者,异步是同时进行,谁先耗时操作完谁谁先通知被观察者
背压(2.0增加的,Flowable)
上游不停的发射,下游处理不过来,
被压策略
Buffer 处理不过来,放入缓存区【128个】,缓存满了,等待
Error 处理不过来,放入缓存区,缓存区满了,抛异常
Drop 处理不过来,放入缓存区,缓存区满了,后面发射的事件丢弃
Latest 处理不过来,放入缓存区,缓存区满了,只存储128个事件
同步的时候,s.request的时候没反应
异步的时候,s.request(10);可以执行10个事件
泛型
可读不可写模式
List<? extend Person> list;
不能 list.add(new Preson)
可以Person =list.get(0)
可写不可以写模式
List<? superPerson> list;
可以 list.add(new Preson)
可以Object=list.get(0)
使用例子
zip 一个界面需要展示用户的一些信息, 而这些信息分别要从两个服务器接口中获取, 而只有当两个都获取到了之后才能进行展示
conectMap 先注册后登陆使用
背压解决办法
一是从数量上进行治理, 减少发送进水缸里的事件 使用Flowable
二是从速度上进行治理, 减缓事件发送进水缸的速度 上游延迟发送
网友评论