RxJava想必大家都不陌生,我们先从它的设计模式了解。
Rxjava的设计模式
RxJava的设计模式采用的是观察者模式,但是又与我们一般的观察者模式不同,我们一般的观察者模式是这样的:
RxJava观察者模式:
从上图我们可以看出,RxJava是一个观察者,多个被观察者,而且观察者和被观察者之间的耦合度更低。
RxJava的核心思想
RxJava是怎么做到链式调用的呢,大致思想就是打包和拆包,当我们订阅后,就将我们的数据通过subscribeActual()一层层的打包,然后通过onNext()进行拆包,每一个打包操作就像是在中间放入一个卡片。
RxJava的Hook操作
通过onAssem进行Hook之后,我们可以监听整个项目的RxJava调用,以及其他操作处理。 当然RxJava在其他地方也有很多是Hook。
RxJava是如何做到线程切换的呢
我们以subscribeOn(Schedulers.io())为例,看它是如何使上面的代码在IO线程运行的。
observeOn(AndroidSchedulers.mainThread())是如何使其下面的代码在主线程中运行的:
关于RxJava中的背压策略
Flowable 很多操作符内部都使用了背压策略, 从而避免过多的数据填满内部的队列. (Flowable 的默认队列是 128),这种有点类似生产者和消费者模式,两者中间也是由一个队列存放处理的数据,所以背压发生的场景一般都是在异步线程操作中。
背压策略的种类:
public enum BackpressureStrategy {
/**
* OnNext events are written without any buffering or dropping.
* Downstream has to deal with any overflow.
* <p>Useful when one applies one of the custom-parameter onBackpressureXXX operators.
*/
MISSING,
/**
* Signals a MissingBackpressureException in case the downstream can't keep up.
*/
ERROR,
/**
* Buffers <em>all</em> onNext values until the downstream consumes it.
*/
BUFFER,
/**
* Drops the most recent onNext value if the downstream can't keep up.
*/
DROP,
/**
* Keeps only the latest onNext value, overwriting any previous value if the
* downstream can't keep up.
*/
LATEST
MISSING:
OnNext事件是在没有任何缓冲或删除的情况下写入的。下游必须处理任何溢流。
当应用一个自定义参数onBackpressureXXX运算符时非常有用。我们选择MISSING策略时可以在下游线程中指定一种策略,通过自定义参数onBackpressureXXX运算符。
ERROR:
发出缺少背压异常的信号,以防下游无法跟上。当队列中的数量超限时,抛出MissingBackpressureException异常
BUFFER:
缓冲所有onNext值,直到下游使用它。队列大小不设上限,但是当队列达到一定的数量的时候,会OOM。
DROP:
如果下游无法跟上,则删除最近的onNext值。当下游来不及处理时,抛弃将要入队的数据。
LATEST:
仅保留最新的onNext值,如果下游无法跟上,则覆盖任何以前的值。这个有点类似DROP,但是LATEST会将最新的需要处理的数据,覆盖之前之前要处理的数据,知道下游能够及时处理。
关于自定义操作符
自定义操作符的话,我们可以模仿RxJava现有的操作符改写。