rxjava笔记(2)
2016-12-17 本文已影响30人
preCh
rxjava笔记(2)
map与flatMap的原理
map的原理,可以查看map的源码进行分析。
会发现map()其实调用了left方法
left的源码大致过程为:
return new Observable<R>(new OnSubscribe<R>() {
@Override
public void call(Subscriber<? super R> o) {
try {
Subscriber<? super T> st = hook.onLift(operator).call(o);
try {
st.onStart();
onSubscribe.call(st);
} catch (Throwable e) {
if (e instanceof OnErrorNotImplementedException) {
throw (OnErrorNotImplementedException) e;
}
st.onError(e);
}
} catch (Throwable e) {
if (e instanceof OnErrorNotImplementedException) {
throw (OnErrorNotImplementedException) e;
}
o.onError(e);
}
}
});
可以看到,在left方法中,返回了一个新建的Observable对象
接下来具体分析可以看出:
- left中生成了一个新的泛型为R的Observable对象
- left后继续调用subscribe的时候,使用的OnSubscriber是新的Observable的onSubscribe对象
- 新observable对象中的call回调中会执行onSubscribe对象的call方法,这个onSubscribe对象是老的Observable对象中的成员变量
- rxjava的left方法利用上述实现了事件流中的对象的变换。非常的巧妙。将新的Subscriber和原始的Observable带来发布-订阅关系。思想有点类似于代理。
同理,flatMap于map的原理差不多,只是变换成了一个Observable对象