适用场景:网络请求、数据库读写、文件读写、定时任务 异步非阻塞的数据流处理 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.youkuaiyun.com/chuyouyinghe/article/details/122807802 https://blog.51cto.com/u_12853553/5896400 https://blog.youkuaiyun.com/weixin_33217202/article/details/114469054 https://blog.youkuaiyun.com/sinat_31057219/article/details/101549254 https://blog.youkuaiyun.com/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最新发射的一条数据
响应式编程框架- RxJava3
于 2023-11-23 11:58:04 首次发布