美文网首页
RxJava学习笔记

RxJava学习笔记

作者: 欧阳峰_oyf | 来源:发表于2020-05-20 10:35 被阅读0次

    思想:响应式编程,事件流编程,可读性高,扩展性高,维护性

    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

    二是从速度上进行治理, 减缓事件发送进水缸的速度 上游延迟发送

    相关文章

      网友评论

          本文标题:RxJava学习笔记

          本文链接:https://www.haomeiwen.com/subject/hnrgohtx.html