深入简出描述RxJava 重要原理

深入简出描述RxJava 重要原理

本文希望通过深入简出地描述RxJava 的一些重要原理,让读者大概知道RxJava 是如何Work 的。
核心对象
ReactiveX 是基于观察者模式设计的,核心对象只有Observable 和Observer。它们最简单的代码为:

interface Observable {
void subscribe(Observer observer);}interface Observer {
void onNext(T t);}
Observable 的核心方法是subscribe(),它接收一个Observer。当调用subscribe() 的时候,就开始通过调用Observer 的onNext() 方法发射数据。

上下游
以下代码中:

ob1 = Observable.create(Func1);ob2 = ob1.map(Func2);ob3 = ob2.subscribeOn(SchedulerA);
ob1 是ob2 的上游,ob3 是ob2 的下游。可以看出,对Observable 进行一次「操作」后会得到一个新的Observable。

官方定义:

操作符
Rx 里的操作符,例如上面的map(Func2),其内部实现是这样(官方命名稍有不同):

ob2 = new MapObservable(ob1, Func2);
所以上一小节的代码可以写成:

ob1 = new CreateObservable(Func1);ob2 = new MapObservable(ob1, Func2);ob3 = new SubscribeOnObservable(ob2, SchedulerA);
可以说Rx 里最重要的是「

官方操作符文档:

操作符的内部实现的核心思想是「

class NoOpObservable {
Observable upstream;

NoOpObservable(Observable upstream) {
    this.upstream = upstream;
}

void subscribe(Observer downstream) {
    upstream.subscribe(downstream);
}}

可以看到,在我们NoOpObservable 的核心方法subscribe() 里,我们直接通过调用上游Observable 的subscribe() 方法,把下游的Observer 往上游传。这样,我们就成功把下游和上游之间建立联系了。

接下来我们增加难度,通过 举个例子,MapObservable 就是一个能对数据流进行加工的操作符,它在构造时传入一个Func 参数,类型为:

(T) -> U
这个Func 的作用,就是把上游发射的数据T 加工成U 然后继续往下游传递。例如,我们可以使用Func 把上游发射的数据转换为String 再传递给下游:

(T t) -> t.toString();
前面有说到,Observable 是通过调用onNext() 来向Observer 发射数据的,为了避免Observable 直接向最下游的Observer 直接发射数据(因为我们还要进行加工),所以我们需要对Observer 也进行Wrap,于是我们可以把MapObservable 设计成这样:

class MapObservable {
MapObservable(Observable upstream, Func mapFunc) { /* … */ }

void subscribe(Observer downstream) {
    upstream.subscribe(new WrapObserver(downstream, mapFunc));
}

class WrapObserver() {
    WrapObserver(Observer downstream, Func mapFunc) { /* ... */ }

    void onNext(T data) {
        U newData = mapFunc.apply(data);
        downstream.onNext(newData);
    }
}}

subscribeOn & observeOn
这是RxJava 中最常用,但又不好理解的两个操作符。因为它们自身不对数据进行任何加工,而是对其它操作符产生「

为了更好地理解这两个操作符,我制作了个动画来展示它们的工作流程:

5b829f6c0001d0ff05720239.jpg

图中分别有ABC 三个不同的Scheduler,它们会把Runnable/Func 扔到不同的线程上去执行,而上图中不同的颜色代表被不同的Scheduler 执行。

可以看到,subscribeOn() 其实影响的是上游操作符中的subscribe() 操作,而observeOn() 影响的是下游操作符中的onNext() 操作(这里是泛指,当然还包括onComplete()、onError() 等)。

所以,想要确定操作符上的某个Func 是在哪个Scheduler 上工作时,先要确定这个Func 是在操作符上的subscribe() 还是onNext() 上执行的。例如Create 操作符传入的Func 是在subscribe() 上执行的,所以它优先受下游最近的subscribeOn() 调度。而Map 操作符传入的Func 是在onNext() 上执行的,所以它优先受上游最近的observeOn() 调度。

再例如Collect 操作符:

.collect(()->V func1, (T)->U func2)
传入的func1 是在subscribe() 上执行的,而func2 是在onNext() 上执行,所以func1 和func2 可能被两个不同的Scheduler 调度。

作者:波斯汪
链接:https://www.imooc.com/article/71376
来源:慕课网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值