开原框架RxJava

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现有的操作符改写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值