前言
RxJava框架運(yùn)用了裝飾設(shè)計(jì)模式(ps.叫靜態(tài)代理也行,關(guān)于兩種設(shè)計(jì)模式的區(qū)別)
其中幾乎所有的操作符本質(zhì)是都是new Obvservable(OnSubscribe<T> f)
,所以當(dāng)你進(jìn)行
Obvservable.create()
.map()
.lift
.subscribe()
等各種連點(diǎn)操作后,最原始的Obvservable
對(duì)象早就被封裝了好幾層了。。。當(dāng)然最終調(diào)用subscrib()
方法的也肯定是最終被封裝后的Obvservable
對(duì)象.
map源碼分析
map幾乎算所有操作符中最簡(jiǎn)單的一個(gè)了, 看完map再看lift, 鵝妹子嚶~~~
Obvservable 中
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
return create(new OnSubscribeMap<T, R>(this, func));
}
其中create是所有操作符中都常用的一個(gè)靜態(tài)方法,本質(zhì)就是new Obvservable(OnSubscribe<T> f)
,所以重點(diǎn)還是在于這個(gè)傳入的OnSubscribe
對(duì)象:
重點(diǎn)在于將原始Subscriber封裝后的MapSubscriber的onNext方法,其他方法可忽略。
public final class OnSubscribeMap<T, R> implements OnSubscribe<R> {
//原先的Observable
final Observable<T> source;
//自定義的轉(zhuǎn)換方法
final Func1<? super T, ? extends R> transformer;
public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) {
this.source = source;
this.transformer = transformer;
}
@Override
public void call(final Subscriber<? super R> o) {
MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
//將新包裝后的MapSubscriber的subscription事件交給原先的Subscriber處理
o.add(parent);
// 下面一句話本質(zhì)上調(diào)用的是source.onSubscribe.call(parent)
source.unsafeSubscribe(parent);
}
static final class MapSubscriber<T, R> extends Subscriber<T> {
final Subscriber<? super R> actual;
final Func1<? super T, ? extends R> mapper;
boolean done;
public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
this.actual = actual;
this.mapper = mapper;
}
@Override
public void onNext(T t) {
R result;
try {
//重點(diǎn)在這里
result = mapper.call(t);
} catch (Throwable ex) {
...
unsubscribe();
onError(OnErrorThrowable.addValueAsLastCause(ex, t));
return;
}
actual.onNext(result);
}
@Override
public void onError(Throwable e) {
...
actual.onError(e);
}
@Override
public void onCompleted() {
...
actual.onCompleted();
}
...
}
}