响应式编程框架- RxJava3

适用场景:网络请求、数据库读写、文件读写、定时任务
异步非阻塞的数据流处理 RxJava,Akka,Vert.x,Reactor。

一、结构
被观察者:observable Flowable、Single、Completable 、Maybe 之间可以相互转化 上游
观察者:observer   下游的
同时代表一个观察者和被观察者:subject
Flowable支持背压、observable不支持背压(背压:上游的数据量太多下游处理不完,多余的数据如何处理避免OOM,没有背压的建议1000条处理)
Single、Completable 、Maybe是简化的observable
被观察者订阅观察者 subscribe:被观察者的数据  让观察者去处理



被观察者的操作符:
创建操作符
转化操作符
组合操作符
功能操作符:线程切换
过滤、条件操作符

线程:
1)Schedules.io()
用于IO密集型的操作,例如读写SD卡文件,查询数据库,访问网络等,具有线程缓存机制,在此调度器接收到任务后,
先检查线程缓存池中,是否有空闲的线程,如果有,则复用,如果没有则创建新的线程,并加入到线程池中,
如果每次都没有空闲线程使用,可以无上限的创建新线程。
2)Schedulers.newThread( )
在每执行一个任务时创建一个新的线程,不具有线程缓存机制,因为创建一个新的线程比复用一个线程更耗时耗力,
虽然使用Schedulers.io( )的地方,都可以使用Schedulers.newThread( ),
但是,Schedulers.newThread( )的效率没有Schedulers.io( )高。
3)Schedulers.computation()
用于CPU 密集型计算任务,即不会被 I/O 等操作限制性能的耗时操作,例如xml,json文件的解析,
Bitmap图片的压缩取样等,具有固定的线程池,大小为CPU的核数。不可以用于I/O操作,因为I/O操作的等待时间会浪费CPU。
4)Schedulers.trampoline()
在当前线程立即执行任务,如果当前线程有任务在执行,则会将其暂停,等插入进来的任务执行完之后,再将未完成的任务接着执行。
5)Schedulers.single()
拥有一个线程单例,所有的任务都在这一个线程中执行,当此线程中有任务执行时,其他任务将会按照先进先出的顺序依次执行。
6)Scheduler.from(@NonNull Executor executor)
指定一个线程调度器,由此调度器来控制任务的执行策略。
7)AndroidSchedulers.mainThread()
在Android UI线程中执行任务,为Android开发定制。

二、语法
API:
https://blog.csdn.net/chuyouyinghe/article/details/122807802
https://blog.51cto.com/u_12853553/5896400
https://blog.csdn.net/weixin_33217202/article/details/114469054
https://blog.csdn.net/sinat_31057219/article/details/101549254
https://blog.csdn.net/qinbin2015/article/details/101060202


三、RxJava中的背压:
》背压出现的原因:
当上下游在不同的线程中,通过Observable发射,处理,响应数据流时,如果上游发射数据的速度快于下游接收处理数据的速度,这样对于那些没来得及处理的数据就会造成积压,这些数据既不会丢失,也不会被垃圾回收机制回收,而是存放在一个异步缓存池中,如果缓存池中的数据一直得不到处理,越积越多,最后就会造成内存溢出,这便是响应式编程中的背压(backpressure)问题
》背压策略的解决思路:
利用响应式拉取,响应式拉取是观察者主动去被观察者那里拉取事件,而被观察者则是被动等待通知再发射事件。
BackpressureStrategy背压策略:
1)MISSING
MissingEmitter:在此策略下,通过Create方法创建的Flowable相当于没有指定背压策略,
不会对通过onNext发射的数据做缓存或丢弃处理,需要下游通过背压操作符。
2)ERROR
ErrorAsyncEmitter:在此策略下,如果放入Flowable的异步缓存池中的数据超限了,则会抛出MissingBackpressureException异常。
3)BUFFER
BufferAsyncEmitter:部维护了一个缓存池SpscLinkedArrayQueue,其大小不限,此策略下,
如果Flowable默认的异步缓存池满了,会通过此缓存池暂存数据,它与Observable的异步缓存池一样,
可以无限制向里添加数据,不会抛出MissingBackpressureException异常,但会导致OOM
4)DROP
DropAsyncEmitter:在此策略下,如果Flowable的异步缓存池满了,会丢掉上游发送的数据。
5)LATEST
LatestAsyncEmitter:与Drop策略一样,如果缓存池满了,会丢掉将要放入缓存池中的数据,
不同的是,不管缓存池的状态如何,LATEST都会将最后一条数据强行放入缓存池中,
来保证观察者在接收到完成通知之前,能够接收到Flowable最新发射的一条数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值