Observable.create(ObservableOnSubscribe<String> { e -> e.onNext("A") })
.subscribe(object : Observer<String>{
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: String) {
}
override fun onError(e: Throwable) {
}
})
Observable的基本使用是调用Observable.create(),create()最终创建的Observable的实现类ObserveCreate,封装传入的ObservableOnSubscribe,ObservableOnSubscribe负责最终的事件发送
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source; //保存传入参数
}
}
interface Observer<T>
public final void subscribe(Observer<? super T> observer) {
observer = RxJavaPlugins.onSubscribe(this, observer); //保存观察者
subscribeActual(observer); //执行观察者的subscribeActual抽象方法,从上面知道这里执行的是ObservableCreate()中重写的抽象方法
}
}
Observable.subscribe(Observer super T> observer)中主要作了两件事:
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent);
source.subscribe(parent);
}
subscribeActual()中主要作以下3件事:
ObservableOnSubscribe<String> { e -> e.onNext("A") } //此处的e为CreateEmitter实例
@Override
public void onNext(T t) {
if (!isDisposed()) { //检查是否取消订阅事件
observer.onNext(t); //(1)响应接收事件
}
}
@Override
public void onComplete() { //响应onComplete事件
if (!isDisposed()) {
observer.onComplete();
}
}
@Override
public void onError(Throwable t) { //响应onError事件
}
事件发送从调用传入CreateEmitter的next(),在next()中直接调用Observer的onNext()响应发送的事件,这里的Observer就是前面订阅时传入的,此处可以看出发送的事件onNext()、onComplete()、onError()事件和观察者监听事件一一对应;
上面的整个流程是最基本的订阅流程,即一层发送事件一层观察事件,虽然简单但却是RxJava的原理所在,很多复杂的程序也是利用此原理一步一步封装拓展过来的,在他们的内部是很多层简单的逻辑,下面分析复杂的流程是如何实现的:
Observable.create(object:ObservableOnSubscribe<String>{ //第一个Observable
override fun subscribe(e: ObservableEmitter<String>) {
e.onNext("A")
}
}).map(object : Function<String,String>{ //第二个Observable
override fun apply(t: String): String {
return "a"
}
}).flatMap { Observable.just("A -> a”)} 第三个Observable
.subscribe(object : Observer<String>{…})
由上面的分析知道,事件订阅是由下向上一次传递的过程,首先还是从订阅subscribe开始分析,由上面知道订阅观察者在包装Observer的同时,会触发执行订阅的Observable的subscribeActual(),此处为第三个Observable对象,flatMap()对应Observable具体实现类为ObservableFlatMap
AbstractObservableWithUpstream(ObservableSource<T> source) {
this.source = source;
}
@Override
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MergeObserver<T, U>(t, mapper, delayErrors, maxConcurrency, bufferSize));
}
从ObservableFlatMap的构造函数中看出内部保存着source实例,使用flatMap()时会创建ObservableFlatMap实例并传入上面创建的被观察者实例,在subscribeActual()中首先封装传入的Observer,再向上调用subscribe()并传入MergeObserver观察者,此处的mapper就是flatMap中设置的转换方法
ObservableFlatMap的subscribe()方法向上调用,同样会触发上级Observable的subscribeActual(),向上一层执行的是map()操作符,map()的具体实现类是ObservableMap,ObservableMap中像ObservableFlatMap保存着上游的被观察者实例和下游的观察者实例,而且在subscribeActual()中同样封装Observer并调用subscribe()向上传递
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
super(source); // 保存传入的被观察者source
this.function = function; //保存map中设置的function
}
@Override
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MapObserver<T, U>(t, function)); //(1)步骤和上面一样,先封装下游传入的观察者继续向上调用,并传递MapObserver
}
经过map向上调用,程序再次进入ObservableCreate中,从上面分析我们知道ObservableCreate中会执行事件的发送,并触发Observer的响应,此处第一层响应的观察者即为MapObserver
MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
super(actual); //(1)保存下游传来的Observer
this.mapper = mapper; //(1)在创建map时保存传入的转换方法
}
@Override
public void onNext(T t) {
U v;
try { // (2)执行设置Function方法,获取 经过方法处理后的数据
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
actual.onNext(v); //(3)调用下游Observer的onNext()
}
前面的分析知道,MapObserver中保存这下游传递的观察者observer和map中设置的转换方法mapper,发送事件后执行到MapObserver的onNext()中,onNext()中首先执行mapper方法转换发送的事件,然后调用 actual.onNext(v)向下游传递事件
MergeObserver(Observer<? super U> actual, Function<? super T, ? extends ObservableSource<? extends U>> mapper,boolean delayErrors, int maxConcurrency, int bufferSize) {
this.actual = actual;
this.mapper = mapper; /
this.observers = new AtomicReference<InnerObserver<?, ?>[]>(EMPTY);
}
@Override
public void onNext(T t) {
ObservableSource<? extends U> p;
try { //(2)调用设置的Function方法,此时返回的是另一个Observable对象
p = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper returned a null ObservableSource");
} catch (Throwable e) {
return;
}
subscribeInner(p); //
}
@SuppressWarnings("unchecked")
void subscribeInner(ObservableSource<? extends U> p) {
for (;;) {
InnerObserver<T, U> inner = new InnerObserver<T, U>(this, uniqueId++); //创建观察者
if (addInner(inner)) {
p.subscribe(inner); //(3)flapMap返回的是一个新的Observable,所以此处为新的Observer订阅观察者,(单层的整个订阅流程在flatMap()内部再走一次)
}
break;
}
}
//InnerObserver
InnerObserver(MergeObserver<T, U> parent, long id) {
this.id = id;
this.parent = parent; //保存MergeObserver观察者
}
@Override
public void onNext(U t) {
parent.drain(); //(4)新的Observable订阅后响应观察者,调用MergeObserver的drain()
}
void drainLoop() {
final Observer<? super U> child = this.actual;
child.onNext(o);
}
经上游传递方法执行到MergeObserver的onNext(),onNext()中首先执行转换方法,因为faltMap中转换后返回新的Observable实例,所以在MergeObserver中会创建新的Observer对象即InnerObserver,然后对新的Observable对象订阅InnerObserver对象,发送的事件会执行到InnerObserver.onNext()中,然后调用MergeObserver的drain(),在drain中获取下游的Observer执行onNext()事件继续向下传递,方法到此执行到了订阅的Observer中,响应onNext()接收事件,最后的Observe接收事件!
just()方法用于传递单个数据,在使用just()操作符后会创建ObservableJust实例,基本功能和其他Observable一样,在subscribeActual()中会执行run(),run()方法中调用observer.onNext(value)发送事件
protected void subscribeActual(Observer<? super T> s) {
ScalarDisposable<T> sd = new ScalarDisposable<T>(s, value); //(1)封装观察者和数据
s.onSubscribe(sd); //
sd.run(); //(2)执行发送内部的run()
}
@Override
public void run() {
if (get() == START && compareAndSet(START, ON_NEXT)) {
observer.onNext(value); //(3)接收发送事件
}
}
ObservableFromArray和ObservableJust功能一致,只是ObservableFromArray允许发送多个数据,在ObservableFromArray的run()方法中会循环依次发送数据
@Override
public void subscribeActual(Observer<? super T> s) {
FromArrayDisposable<T> d = new FromArrayDisposable<T>(s, array); (1)
s.onSubscribe(d);
d.run();
}
void run() {
T[] a = array;
int n = a.length;
for (int i = 0; i < n && !isDisposed(); i++) { //(2)循环发送事件
T value = a[i];
actual.onNext(value);
}
if (!isDisposed()) {
actual.onComplete();
}
}
由前面的源码分析知道map()操作符创建的是ObservableMap的被观察者,其中主要执行三个操作:
具体的执行逻辑和map()一致,只是在Observer中处理不同,因为flatMap返回的是一个新的Observable,所以要对新的被观察者进行订阅观察,在接受新的事件后调用下层的观察者发送事件
将多个Observable的事件组合一一对应发送,zip()操作符最终会创建ObservableZip实例,查看ObservableZip方法
public void subscribeActual(Observer<? super R> s) {
ObservableSource<? extends T>[] sources = this.sources;
int count = 0;
count = sources.length;
//创建ZipCoordinator实例,传参:1、观察者Observer;2、传入的Function;3、Observable集合数量;4、是否推迟Error
ZipCoordinator<T, R> zc = new ZipCoordinator<T, R>(s, zipper, count, delayError);
zc.subscribe(sources, bufferSize); //调用subscribe()
}
public void subscribe(ObservableSource<? extends T>[] sources, int bufferSize) {
ZipObserver<T, R>[] s = observers; //创建观察者数组,长度为count
int len = s.length;
for (int i = 0; i < len; i++) {
s[i] = new ZipObserver<T, R>(this, bufferSize); //遍历创建ZipObserver
}
this.lazySet(0);
actual.onSubscribe(this); //响应观察者的onSubscribe()
for (int i = 0; i < len; i++) {
sources[i].subscribe(s[i]); //遍历Observable集合依次订阅观察者
}
}
ZipObserver(ZipCoordinator<T, R> parent, int bufferSize) {
this.parent = parent;
this.queue = new SpscLinkedArrayQueue<T>(bufferSize); //实例化一个队列,默认大小128
}
@Override
public void onNext(T t) { //响应事件的onNext()
queue.offer(t);
parent.drain();
}
public void drain() {
final ZipObserver<T, R>[] zs = observers;
final Observer<? super R> a = actual; // 下游传递的Observer
for (; ; ) { //两层死循环
for (;; ) {
int i = 0;
int emptyCount = 0;
for (ZipObserver<T, R> z : zs) {
if (os[i] = null) {
T v = z.queue.poll(); //从Observer的队列中获取事件
boolean empty = v == null;
if (!empty) { //如果获取的事件不为空,则复制os[i],否则emptyCount++
os[i] = v;
} else {
emptyCount++;
}
} else { ………. }
i++; //下标++
}
if (emptyCount != 0) { //如果取出数据不为空,则跳出循环,确保每个Observable都取到了值
break;
}
// 执行zipper中传入的压缩方法
v = ObjectHelper.requireNonNull(zipper.apply(os.clone()), "The zipper returned a null value");
a.onNext(v); //执行下游onNext()
}
}
}
简述工作过程:(第一、第二个观察者用 first、second代替)
@Override
public void subscribeActual(Observer<? super T> t) {
source.subscribe(new OnErrorReturnObserver<T>(t, valueSupplier)); //创建OnErrorReturnObserver
}
//OnErrorReturnObserver
@Override
public void onError(Throwable t) { //在onError()方法中触发
T v;
v = valueSupplier.apply(t); //(1)在拦截onError时调用设置的方法,生成要发送的数据
actual.onNext(v); //(2)发送新生成的数据
actual.onComplete();
}
最终创建ObservableOnErrorReturn和OnErrorReturnObserver,在拦截到error后发送特定的值
创建ObservableRetryWhen实例,在使用retryWhen时会传入一个返回新的Observable的功能方法,在ObservableRetryWhen内部首先调用方法获取创建的newObservable,并对newObservable订阅观内部察查者Inner.Observer,在外部订阅观察者时当发生异常回调onError()时,调用newObservable发送事件,
compose()可以将一系列的相同的操作封装在一起使用,将功能封装在ObservableTransformer的实例中,在接口方法中可以对传入的Observable执行操作然后重新返回,系统会将重新返回的Observable封装在新的ObservableFromUnsafeSource中继续执行
public static <T> ObservableTransformer<T, T> rxSchedulerHelper() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(Observable<T> upstream) { //对传入的Observable进行指定线程操作
return upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
Observable.just(1)
.compose(RxHelper.<Integer>rxSchedulerHelper())
.subscribe()
//效果等同于
Observable.just(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
public final <R> Observable<R> compose(ObservableTransformer<? super T, ? extends R> composer) {
return wrap(((ObservableTransformer<T, R>) composer.apply(this));
}
public static <T> Observable<T> wrap(ObservableSource<T> source) {
return RxJavaPlugins.onAssembly(new ObservableFromUnsafeSource<T>(source));
}
//ObservableFromUnsafeSource只是作为了一层中转站
public final class ObservableFromUnsafeSource<T> extends Observable<T> {
final ObservableSource<T> source;
public ObservableFromUnsafeSource(ObservableSource<T> source) {
this.source = source;
}
@Override
protected void subscribeActual(Observer<? super T> observer) {
source.subscribe(observer);
}
}
执行流程如下:
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer); //(1)创建
observer.onSubscribe(parent); //回调返回parent
}
由上面的分析知道,在ObservableOnCreate()的subscribeActual()会创建CreateEmitter对象封装Observer,并回调onSubscribe()返回parent
@Override
public void dispose() {
DisposableHelper.dispose(this); //设置解除订阅标识位
}
@Override
public boolean isDisposed() {
return DisposableHelper.isDisposed(get()); //获取是否解除订阅
}
@Override
public void onNext(T t) {
if (!isDisposed()) {
observer.onNext(t);
}
}
到此RxJava的基本原理和常用的操作符就分析完了,RxJava的操作符之多功能之强大真的不是几句话能说完的,但了解其内部原理有利于更好的封装和使用它,除了本篇之外还有关于Schedule的部分也很重要会放在下一篇文章整理。