初学者的RxJava2.0教程(一步步带你看源码)
初学者的RxJava2.0教程
我以前很怕麻烦,一般不喜欢做笔记。因为RXjava2.0以前看过,等过了一段时间再看,就觉得比较陌生了,基于这个原因,想用文档记录一下,方便记忆。还有一方面做个分享,希望可以帮助有需要的人。如果有不对的地方希望大家指出来,我再完善文档。
内容
我主要从源码来分析,帮助大家理解Rxjava2.0:
1.分析最简单的Observable-subscribe订阅关系;
2. 分析Observable-map-subscribeOn-subscribe订阅关系,主要是线程的切换;
3. 分析Observable-map-observeOn-subscribe订阅关系,主要是线程的切换;
开始分析代码了,希望大家不要觉得无聊
所有详解都在源码中注释了,请大家一定注意代码中的注释
RxJava 有以下三个基本的元素:
- 被观察者(Observable)
- 观察者(Observer)
- 订阅(subscribe)
分析Observable-subscribe的关系
- RxJava通常使用的链式调用:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
Log.i("RxjavaSourceDemo", "subscribe" + "---"+Thread.currentThread());
e.onNext("我今晚吃鸡");
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.i("RxjavaSourceDemo", "onSubscribe" + "---"+Thread.currentThread());
}
@Override
public void onNext(String value) {
Log.i("RxjavaSourceDemo", "onNext" + "---" + value+"-----"+Thread.currentThread());
}
@Override
public void onError(Throwable e) {
Log.i("RxjavaSourceDemo", "onError" + "-----"+Thread.currentThread());
}
@Override
public void onComplete() {
Log.i("RxjavaSourceDemo", "onComplete" + "---" +Thread.currentThread());
}
});
- 运行结果
I/RxjavaSourceDemo: onSubscribe---Thread[main,5,main]
I/RxjavaSourceDemo: subscribe---Thread[main,5,main]
I/RxjavaSourceDemo: onNext---我今晚吃鸡-----Thread[main,5,main]
下面为了便于大家理解,我将上述的链式demo分成3个模块,来说说以上三者是如何协作的:
- 源码流程(代码的讲解,请看注释):
1. 创建被观察者:
//observable :被观察者
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
Log.i("RxjavaSourceDemo", "subscribe" + "---" + Thread.currentThread());
e.onNext("我今晚吃鸡");
}
});
- Observable.create(new ObservableOnSubscribe() {…}的源码内容:
/**
* Observable.create(new ObservableOnSubscribe<String>() {
* @Override
* public void subscribe(ObservableEmitter<String> e) throws Exception {
* Log.i("RxjavaSourceDemo", "subscribe" + "---"+Thread.currentThread());
* e.onNext("我今晚吃鸡");
* }
* })
* @param source=new ObservableOnSubscribe<String>() {...}
*/
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
//强调source不能为空
ObjectHelper.requireNonNull(source, "source is null");
//create(ObservableOnSubscribe<T> source)方法返回的结果是RxJavaPlugins.onAssembly()方法生成的
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
- RxJavaPlugins.onAssembly(new ObservableCreate(source))的源码内容:
public static <T> Observable<T> onAssembly(Observable<T> source) {
//onObservableAssembly由setOnObservableAssembly(null)得到的,
//所以onObservableAssembly=null
Function<Observable, Observable> f = onObservableAssembly;
if (f != null) {
return apply(f, source);
}
//返回的就是传进来的source,source=new ObservableCreate<T>(source);
return source;
}
-结果 Observable.create(new ObservableOnSubscribe() {}返回的就是的
new ObservableCreate(source)对象,所以被观察者observable 就是new ObservableCreate(source)对象
2.创建观察者:
//observer :观察者
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.i("RxjavaSourceDemo", "onSubscribe" + "---" + Thread.currentThread());
}
@Override
public void onNext(String value) {
Log.i("RxjavaSourceDemo", "onNext" + "---" + value + "-----" + Thread.currentThread());
}
@Override
public void onError(Throwable e) {
Log.i("RxjavaSourceDemo", "onError" + "-----" + Thread.currentThread());
}
@Override
public void onComplete() {
Log.i("RxjavaSourceDemo", "onComplete" + "---" + Thread.currentThread());
}
};
3.订阅
observable.subscribe(observer);
- 订阅Observable .subscribe(new Observer() {})的源码分析内容
/**
* 订阅
* new ObservableCreate<T>(source){}.subscribe(new Observer<String>() {
* @Override
* public void onSubscribe(Disposable d) {
* Log.i("RxjavaSourceDemo", "onSubscribe" + "---"+Thread.currentThread());
* }
* @Override
* public void onNext(String value) {
* Log.i("RxjavaSourceDemo", "onNext" + "---" + value+"-----"+Thread.currentThread());
* }
* @Override
* public void onError(Throwable e) {
* Log.i("RxjavaSourceDemo", "onError" + "-----"+Thread.currentThread());
* }
* @Override
* public void onComplete() {
* Log.i("RxjavaSourceDemo", "onComplete" + "---" +Thread.currentThread());
* }
* });
* @param observer =new Observer<String>() {...}对象
*/
@SchedulerSupport(SchedulerSupport.NONE)
@Override
public final void subscribe(Observer<? super T> observer) {
ObjectHelper.requireNonNull(observer, "observer is null");
try {
//RxJavaPlugins.onSubscribe(this, observer)得到的就是观察者observer
observer = RxJavaPlugins.onSubscribe(this, observer);
//检测观察者不为null
ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
//这个就是代码流程的关键了,真正触发逻辑的地方,下面详情解析
subscribeActual(observer);
} catch (NullPointerException e) { // NOPMD
throw e;
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
// can't call onError because no way to know if a Disposable has been set or not
// can't call onSubscribe because the call might have set a Subscription already
RxJavaPlugins.onError(e);
NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
npe.initCause(e);
throw npe;
}
}
- subscribeActual(observer)的源码分析内容(主要的逻辑)
/**
* 是个抽象方法,但是由上可以被观察者是由于new ObservableCreate<T>(source)生成的
* 所以实现类是ObservableCreate
**/
protected abstract void subscribeActual(Observer<? super T> observer);
- ObservableCreate类中的方法就是整个Observable-subscribe的具体实现逻辑了,请关注subscribeActual实现方法和传进来的被观察者和观察者引用之间的调用关系
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
/**
* source被观察者,就是通过public static <T>Observable<T>create(ObservableOnSubscribe<T>source) {...}
*的source对象
*/
public ObservableCreate(ObservableOnSubscribe<T> source) {
//获得被观察者引用
this.source = source;
}
/**
*subscribeActual的具体实现逻辑,这里就是实现观察者与被观察者直接的调用逻辑
*@param observer观察者
*/
@Override
protected void subscribeActual(Observer<? super T> observer) {
//CreateEmitter 发射器,获得了观察者引用
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
//调用了观察者实现类中的 public void onSubscribe(Disposable d) {}方法
observer.onSubscribe(parent);
try {
/**
* source是被观察者,source=new ObservableOnSubscribe<String>() {...},
* Observable.create(new ObservableOnSubscribe<String>() {
* @Override
* public void subscribe(ObservableEmitter<String> e) throws Exception {
* Log.i("RxjavaSourceDemo", "subscribe" + "---"+Thread.currentThread());
* e.onNext("我今晚吃鸡");
* }
* })所以调用了subscribe(ObservableEmitter<String> e)方法
* ,然后 e.onNext("我今晚吃鸡")=new CreateEmitter<T>(observer).onNext(T t),
* @param Tt=“我今晚吃鸡”
*/
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
//发射器的实现类
static final class CreateEmitter<T>
extends AtomicReference<Disposable>
implements ObservableEmitter<T>, Disposable {
private static final long serialVersionUID = -3434801548987643227L;
final Observer<? super T> observer;
CreateEmitter(Observer<? super T> observer) {
this.observer = observer;
}
/**
* 被观察者中实现的方法,下面onNext(T t)就是e.onNext("我今晚吃鸡")这句代码给调用的
*/
@Override
public void onNext(T t) {
if (t == null) {
onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
return;
}
if (!isDisposed()) {
/**
* observer是观察者,就是new Observer<String>() {...}对象
* observer.onNext(t)代码实现的就是 .subscribe(new Observer<String>() {
* @Override
* public void onSubscribe(Disposable d) {
* Log.i("RxjavaSourceDemo", "onSubscribe" + "---"+Thread.currentThread());
* }
* @Override
* public void onNext(String value) {
* Log.i("RxjavaSourceDemo", "onNext" + "---" + value+"-----"+Thread.currentThread());
* }
* @Override
* public void onError(Throwable e) {
* Log.i("RxjavaSourceDemo", "onError" + "-----"+Thread.currentThread());
* }
* @Override
* public void onComplete() {
* Log.i("RxjavaSourceDemo", "onComplete" + "---" +Thread.currentThread());
* }
* });
* 中的 public void onNext(String value) {...}这句代码
*/
observer.onNext(t);
}
}
@Override
public void onError(Throwable t) {
if (t == null) {
t = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
}
if (!isDisposed()) {
try {
//如上面解释,实现的是.subscribe({...})中内部类中的onError()方法
observer.onError(t);
} finally {
dispose();
}
} else {
//如上面解释,实现的是.subscribe({})中内部类中的方法
RxJavaPlugins.onError(t);
}
}
@Override
public void onComplete() {
if (!isDisposed()) {
try {
//如上面解释,实现的是.subscribe({...})中内部类中的onComplete()方法
observer.onComplete();
} finally {
dispose();
}
}
}
一张以上流程的简单流程图
- 还有2,3两点还没来得及编写,因为文档的格式写的太麻烦了,太耗时了,我有时间一一补齐
以上是自己看源码的,根据自己的理解编写的,如有不对的地方,欢迎大家指出,谢谢!