RxJava学习笔记_原理理解

一、三大编程方式

看到有大神博客精妙总结(https://www.jianshu.com/p/15b2f3d7141a),以大象装冰箱为例,借鉴过来。

1、函数式编程(面向过程)

    第一步:构建一个函数,接收大象和冰箱两个参数
    第二步:在此函数内部做实现,返回冰箱已经装入大象
    第三步:调用此函数,将大象和冰箱作为参数传入

2、面向对象编程

    第一步:构建一个冰箱,具有开门,关门的方法
    第二步:构建一个大象,具有走进冰箱的方法
    第三步:实例化一个冰箱对象,实例化一个大象对象,冰箱对象调用开门方法,大象对象调用走进冰箱方法,冰箱对象调用关门方法,大象被成功装入冰箱。

3、响应式编程

    第一步:构建一个发射源,发送大象
    第二步:构建一个响应器,接受到大象后关进冰箱。
    第三步:用这个响应器监听发射源。

二、RxJava是基于 函数式编程+响应式编程 叠加后的编程方式

函数响应式编程(Functional Reactive Programming:FRP):是一种通过一系列函数的组合调用来发射,转变,监听,响应数据流的编程范式。
在RxJava中,函数响应式编程具体表现为一个观察者(Observer)订阅一个可观察对象(Observable),通过创建可观察对象发射数据流,经过一系列操作符(Operators)加工处理和线程调度器(Scheduler)在不同线程间的转发,最后由观察者接受并做出响应的一个过程。

三、RxJava2 中五对观察者模式

1、ObservableSource/Observer

一次可以发送单条数据或者数据序列onNext,完成后可以发送onComplete通知或onError异常通知,不支持背压。

2、Publisher/Subscriber

在ObservableSource/Observer基础上进行改进,支持背压,一次可以发送单条数据或者数据序列onNext,也可以在完成时发送onComplete通知或onError异常通知,但效率没有ObservableSource/Observer高(初步猜测是背压策略原因)。

3、SingleSource/SingleObserver

ObservableSource/Observer的简化版,只能发送单条数据,可发送onSuccess与onError通知,不支持背压。

4、CompletableSource/CompletableObserver

ObservableSource/Observer简化版,不能发送数据,只发送onComplete或onError通知,不支持背压。

5、MaybeSource/MaybeObserver

SingleSource/SingleObserver与CompletableSource/CompletableObserver的合并版,只能发送单条数据,可以发送onSuccess与onComplete或onError通知,不支持背压。

四、RxJava背压

作用:控制事件发送与接收的速度。

因被观察者发送事件速度 与 观察者接收事件速度 不匹配(一般是前者 快于 后者),从而导致观察者无法及时响应 / 处理所有 被观察者发送事件 ,故便有了背压策略。

如:网络请求,具体场景:有很多网络请求需要执行,但执行者的执行速度没那么快,此时就需要使用背压策略来进行控制。

使用:Flowable

详细:https://blog.csdn.net/carson_ho/article/details/79081407

五、RxJava多线程

RxJava支持将操作符指定在对应的调度器上,使用Schedulers。Android中同样有AndroidSchedulers。

调度器类型 效果
Schedulers.computation( ) 用于计算任务,如事件循环或和回调处理,不要用于IO操作(IO操作请使用Schedulers.io());默认线程数等于处理器的数量
Schedulers.from(executor) 使用指定的Executor作为调度器
Schedulers.immediate( ) 在当前线程立即开始执行任务
Schedulers.io( ) 用于IO密集型任务,如异步阻塞IO操作,这个调度器的线程池会根据需要增长;对于普通的计算任务,请使用Schedulers.computation();Schedulers.io( )默认是一个CachedThreadScheduler,很像一个有线程缓存的新线程调度器
Schedulers.newThread( ) 为每个任务创建一个新线程
Schedulers.trampoline( ) 当其它排队的任务完成后,在当前线程排队开始执行

猜你喜欢

转载自blog.csdn.net/qiangzai110110/article/details/83714240