前言
RxJava框架運用了裝飾設計模式(ps.叫靜態代理也行,關于兩種設計模式的區別)
其中幾乎所有的操作符本質是都是new Obvservable(OnSubscribe<T> f)
,所以當你進行
Obvservable.create()
.map()
.lift
.subscribe()
等各種連點操作后,最原始的Obvservable
對象早就被封裝了好幾層了。。。當然最終調用subscrib()
方法的也肯定是最終被封裝后的Obvservable
對象.
map源碼分析
map幾乎算所有操作符中最簡單的一個了, 看完map再看lift, 鵝妹子嚶~~~
Obvservable 中
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
return create(new OnSubscribeMap<T, R>(this, func));
}
其中create是所有操作符中都常用的一個靜態方法,本質就是new Obvservable(OnSubscribe<T> f)
,所以重點還是在于這個傳入的OnSubscribe
對象:
重點在于將原始Subscriber封裝后的MapSubscriber的onNext方法,其他方法可忽略。
public final class OnSubscribeMap<T, R> implements OnSubscribe<R> {
//原先的Observable
final Observable<T> source;
//自定義的轉換方法
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);
// 下面一句話本質上調用的是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 {
//重點在這里
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();
}
...
}
}