.map(new Func1<String, String>() { //Observable2
@Override
public String call(String s) {
System.out.print(Thread.currentThread().getName() + “:first–” + s +“\n”);
return s + s;
}
})
.subscribe(new Subscriber() { //代码⑥ Subscriber
@Override
public void onCompleted() {
System.out.print(Thread.currentThread().getName()+“\n”);
System.out.print(“completed”+“\n”);
}
@Override
public void onError(Throwable e) {
System.out.print(“error”);
}
@Override
public void onNext(String s) {
System.out.println(s);
}
});
}
先说说自己的理解,若把整个链条看成一个整体对象,那么just创建被观察者对象,而subscribe()里的Subscriber作为观察者;若每一步都分开看,just()和subscribe()中间的操作符即是观察者,又是被观察者。
Observable中每个操作符基本都会创建出一个新的Observable;因此可以解理成后一级的操作符去观察前一个Observable对象;以上例来说,.subscribe的Subscriber所观察的对象就是.map返回的Observable2,而.map的Subscriber所观察的对象就是 Observable.just(“a”)得到的对象Observable1;
下面介绍实现代码,整个链式调用真正开始的地方是.subscribe(),我们就从这里开始。省略掉一些代码,只看关键部分如下:
private static Subscription subscribe(Subscriber<? super T> subscriber, Observable observable) {
…
try {
// allow the hook to intercept and/or decorate
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber); //代码①
return hook.onSubscribeReturn(subscriber);
}
…
}
hook.onSubscribeStart(observable, observable.onSubscribe)得到的对象就是observable.onSubscribe,而此处的observable明显就是this,也就是上例中的observable2对象,即把subscriber传入到了observable2里面以供其调用。
再跟着代码进入observable2(.map操作符)的实现。其主要实现是lift和OperatorMap。如下:
public final Observable map(Func1<? super T, ? extends R> func) {
return lift(new OperatorMap<T, R>(func));
}
lift和OperatorMap各自干了什么事情呢?先看OperatorMap,Func1也作为构造参数传入。关键代码:
@Override
public Subscriber<? super T> call(final Subscriber<? super R> o) { //代码②
return new Subscriber(o) {
@Override
public void onCompleted() {
o.onCompleted();
}
@Override
public void onError(Throwable e) {
o.onError(e);
}
@Override
public void onNext(T t) {
try {
o.onNext(transformer.call(t));
} catch (Throwable e) {
Exceptions.throwOrReport(e, this, t);
}
}
};
}
这里new出了一个观察者对象Subscriber,它实现了什么功能通过 o.onNext(transformer.call(t));即将例子中的Func1代码执行后将结果传入到下一层。即这里运行了Func1的代码。
再看lift()操作符,看其返回值也就是我们定义的observable2对象。因此subscribe里的"代码①"的call即是此处observable2里OnSubscribe的call方法;再看call方法,“代码④”部分则是调用到了observable1对象里OnSubscribe的call方法,而“代码③”将Func1操作动作转变为Subscriber,通过call(o)完成对下一级Subscriber的引用。
public final Observable lift(final Operator<? extends R, ? super T> operator) {
return new Observable(new OnSubscribe() {
@Override
public void call(Subscriber<? super R> o) {
try {
Subscriber<? super T> st = hook.onLift(operator).call(o); //代码③
try {
// new Subscriber created and being subscribed with so ‘onStart’ it
st.onStart();
onSubscribe.call(st); //代码④
} catch (Throwable e) {
// localized capture of errors rather than it skipping all operators
// and ending up in the try/catch of the subscribe method which then
// prevents onErrorResumeNext and other similar approaches to error handling
Exceptions.throwIfFatal(e);
st.onError(e);
}
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
// if the lift function failed all we can do is pass the error to the final Subscriber
// as we don’t have the operator available to us
o.onError(e);
}
}
});
}
到这里“代码④”执行,即到了observable1对象,也就是例子中 Observable.just(“a”)所得到对象的OnSubscribe的call()方法,如下:
最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!
[外链图片转存中…(img-7LqVt9Mx-1715749453511)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!