RxJava1 已经在项目中用来一年多了,最近准备转换成 RxJava2, 除了去了解 2.0版本的不同 ,还简单的去了解了一下源码,顺便做个记录。
对源码的分析,要明确目的:
1. 数据是怎样从数据源到订阅者的;
2. 线程切换时怎样实现的;
一、 数据源的发射到订阅
Observable<Integer> observable = Observable.create(
new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e)
throws Exception {
e.onNext(1);
e.onComplete();
}
});
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e(TAG, "onSubscribe " + d.isDisposed());
}
@Override
public void onNext(Object value) {
Log.e(TAG, "onNext " + value.toString());
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError " + e.getMessage());
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete ");
}
};
observable.subscribe(observer);
上面的例子没有使用链式调用方式更能清楚的看到它们的联系
第一步:创建 observable
Observable<Integer> observable = Observable.create(....)
第二步:创建 observer
Observer observer = new Observer()
第三步:将 observable 与 observer 联系起来
observable.subscribe(observer);
第一步,创建 observable
Observable#create(…) io.reactivex.Observable.java ,
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
上面的 create(…) 方法返回的是一个 observable 对象,其实最终返回的是 ObservableCreate.
RxJavaPlugins.onAssembly 只是相当于 hook 而已
public static <T> Observable<T> onAssembly(Observable<T> source) {
Function<Observable, Observable> f = onObservableAssembly;
if (f != null) {
return apply(f, source);
}
return source;
}
ObservableCreate<T> extends Observable<T> ;
public abstract class Observable