使用的库是compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
不同的版本,可能源码不一样
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
1.先来看看要解析的例子
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("1111");
}
}).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.v("next", s);
}
});
很简单的例子,就是打印字符串1111。我们来看create方法。
public final static <T> Observable<T> create(Observable.OnSubscribe<T> f) {
return new Observable<T>(hook.onCreate(f));
}
protected Observable(Observable.OnSubscribe<T> f) {
this.onSubscribe = f;
}
这个hook.onCreate(f)方法,里面就直接把f返回回来,可以查看源码这里就不粘出来了。所以Observable.create其实就是把OnSubscribe对象实例存储到Observable里面的onSubscribe。
接下来我们来看subscribe()方法。
public final Subscription subscribe(final Observer<? super T> observer) {
if (observer instanceof Subscriber) {
return subscribe((Subscriber<? super T>)observer);
}
return subscribe(new Subscriber<T>() {
@Override
public void onCompleted() {
observer.onCompleted();
}
@Override
public void onError(Throwable e) {
observer.onError(e);
}
@Override
public void onNext(T t) {
observer.onNext(t);
}
});
}
我们发现会把observer对象转换成Subscriber对象,然后我们来看subscribe()方法。
public final Subscription subscribe(Subscriber<? super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
private static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
subscriber.onStart();
try {
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
return hook.onSubscribeReturn(subscriber);
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
try {
subscriber.onError(hook.onSubscribeError(e));
} catch (OnErrorNotImplementedException e2) {
throw e2;
} catch (Throwable e2) {
RuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);
hook.onSubscribeError(r);
throw r;
}
return Subscriptions.unsubscribed();
}
}
中间删掉了一些代码,我们看核心代码。开始会执行subscriber.onStart()方法,就是在subscribe方法中新new Subscriber的。
下面的逻辑可能有点绕。
然后hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber)这个方法中的hook.onSubscribeStart(observable, observable.onSubscribe)这个方法里,就直接把observable.onSubscribe返回回来,也就是说,这个方法其实就是observable.onSubscribe.call(subscriber),这个onSubscribe是在create()的时候传递进来的,那这个方法就走到上面例子的subscriber.onNext("1111"),而这个subscriber实例,就是刚刚在subscribe()方法里new subscribe()出来的,然后执行到observer.onNext(t)这里,这里的observer实例是在例子中subscribe(new Observer<String>()),这个new observer<String>()的,然后就到Log.v("next", s)这里了,整个流程就完了,log日志就打出来了。
可能会有点绕,可以用debug模式,在关键处打断点,一个一个观察。