RxJava2原理解析

本文主要讲解RxJava2的原理,不再讲解其用法和相关概念。首先我们知道,RxJava是流式编程,在每一条流中,都至少包含三个要素:源头/被订阅者(ObservableFlowable)、订阅者(Observersubscriber)、触发时机(subscribe()方法),其次就是线程切换(subscribeOn()observeOn()),最后就是数据操作(如map()flatMap()等),所以本篇主要对这三个方面进行讲解。无论Observable还是Flowable,两者虽然内部实现有些不同,但基本原理都是相同的,所以本文只拿Observable进行讲解。

1. 确认订阅关系(subscribe()

首先看下最简单的情况:

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        // doSomething, eg: 
        // emitter.onNext("onNext");
        // emitter.onComplete();
    }
}).subscribe();

一条RxJava流若是没有调用subscribe()方法,该流便无法执行,即必须由subscribe()确定了订阅关系后这条流才能生效,原因如下:

// Observable.java
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
    ObjectHelper.requireNonNull(source, "source is null");
    // 可以直接忽略RxJavaPlugins的相关方法,不影响我们理解原理
    return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source)); 
 }
// 无论调用subscribe的哪个重载方法,最终都会走到这个方法
public final void subscribe(Observer<? super T> observer) {
    ... // 省去不重要代码
    subscribeActual(observer);
    ...
}
protected abstract void subscribeActual(Observer<? super T> observer);

可以看到subscribe()里面主要是调用了subscribeActual,而subscribeActual是一个抽象方法,所以具体实现在子类中,这里的子类便是ObservableCreate,再来看它的实现:

// ObservableCreate.java
public ObservableCreate(ObservableOnSubscribe<T> source) {
    this.source = source;
}
protected void subscribeActual(Observer<? super T> observer) {
    CreateEmitter<T> parent = new CreateEmitter<T>(observer);
    observer.onSubscribe(parent);
    try {
        source.subscribe(parent);
    } catch (Throwable ex) {
        Exceptions.throwIfFatal(ex);
        parent.onError(ex);
    }
}

ObservableCreatesubscribeActual的实现就是将我们的observer封装成CreateEmitterObservableEmitter的实现类),再执行observer.onSubscribe,确保onSubscribe总能在onNext等其他订阅行为之前执行,接着就是我们的核心代码:source.subscribe(parent);source便是我们一开始创建流时新建的ObservableOnSubscribe对象,而parent则是封装后的CreateEmitter,所以其实此时执行的便是在创建ObservableOnSubscribe时实现的public void subscribe(ObservableEmitter<String> emitter) throws Exception方法,此时整条流的订阅关系便成立了,事件便开始按照我们的实现进行处理:

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        // doSomething, eg: 
        // emitter.onNext("onNext");
        // emitter.onComplete(); 
    }
}).subscribe();

现在我们知道,事件流的执行实际上是由子类实现的subscribeActual控制的,所以其他的Observable创建方式也是一样的道理,这里再以fromIterable为例看一下:

// Observable.java
public static <T> Observable<T> fromIterable(Iterable<? extends T> source) {
    ObjectHelper.requireNonNull(source, "source is null");
    return RxJavaPlugins.onAssembly(new ObservableFromIterable<T&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值