本文主要讲解RxJava2的原理,不再讲解其用法和相关概念。首先我们知道,RxJava是流式编程,在每一条流中,都至少包含三个要素:源头/被订阅者(Observable
或Flowable
)、订阅者(Observer
或subscriber
)、触发时机(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);
}
}
ObservableCreate
中subscribeActual
的实现就是将我们的observer
封装成CreateEmitter
(ObservableEmitter
的实现类),再执行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