操作符:
1.map(new Func1(...)) :用于變換Observable,返回新的Observable
調(diào)度器:
1.調(diào)用observeOn(...)后之后的操作符map等會(huì)立馬改變成在observeOn所設(shè)置的線程運(yùn)行
observeOn是設(shè)置訂閱者的運(yùn)行線程,即
2.調(diào)用subscribeOn(...)后炕置,到調(diào)用observeOn()為止剖煌,中間的操作符均在subscribeOn設(shè)置的線程運(yùn)行沥匈。(subscribeOn不管在哪調(diào)用神帅,都和開頭調(diào)用一樣效果,挠将,而且調(diào)用多次胳岂,只有第一次有用)。
3.默認(rèn)情況下舔稀, Observable.doOnSubscribe() 執(zhí)行在 subscribe() 發(fā)生的線程乳丰;而如果在 doOnSubscribe() 之后有 subscribeOn() 的話,它將執(zhí)行在離它最近的 subscribeOn() 所指定的線程内贮。
原理
public interface Operator<R, T> extends Func1<Subscriber<? super R>, Subscriber<? super T>> {
// cover for generics insanity
}
public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
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 {
// new Subscriber created and being subscribed with so 'onStart' it
st.onStart();
onSubscribe.call(st);
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
st.onError(e);
}
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
o.onError(e);
}
}
});
}
public static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(hook.onCreate(f));
}
protected Observable(OnSubscribe<T> f) {
this.onSubscribe = f;
}
首先产园,調(diào)用Observable.create(```),其實(shí)就是調(diào)用構(gòu)造函數(shù),將 onSubscribe保存為成員變量夜郁,調(diào)用subscribe(Subscriber subscriber)其實(shí)就是調(diào)用onSubscribe.call(subscriber)什燕。
這個(gè)call()函數(shù)就是我們自己重寫的那個(gè)函數(shù)。
而調(diào)用lift()操作符后竞端,新返回一個(gè)Observable屎即。
這里,我們梳理一下代碼流程:
- 首先事富,調(diào)用Observable.create(···)技俐,生成Observable對(duì)象,記為ObservableA统台,它里面又一個(gè)成員變量OnSubscribe對(duì)象雕擂,我們記為OnSubscribeA,OnSubscribeA里面有我們重寫的call()方法贱勃。
- 接下來井赌,我們調(diào)用lift()操作符進(jìn)行變換,又生成一個(gè)Observable對(duì)象贵扰,這個(gè)對(duì)象我們記為ObservableB,ObservableB對(duì)象是由lift()操作符生成的族展,與我們無關(guān),ObservableB的成員變量OnSubscribe對(duì)象也是新生成的拔鹰,并且是由lift()自己生成的,與我們無關(guān)贵涵,這個(gè)OnSubscribe對(duì)象我們記為OnSubscribeB列肢,OnSubscribeB的call()函數(shù)也是lift()生成的恰画,與我們無關(guān)。此步驟結(jié)束后返回ObservableB
- 然后瓷马,我們調(diào)用subscribe(···)函數(shù)拴还,傳入Subscriber對(duì)象,調(diào)用ObservableB.OnSubscribeB.call(subscriber)欧聘。ok,接下來我們就看看
ObservableB.OnSubscribeB.call(···)都干啥了片林。
ObservableB.OnSubscribeB.call(subscriber)分析:
- 首先調(diào)用operator.call(subscriber),這個(gè)operator返回一個(gè)新的Subscriber,這步很關(guān)鍵怀骤,就是這步實(shí)現(xiàn)轉(zhuǎn)換费封,并且是逆向轉(zhuǎn)換。而且新生成的Subscriber包含舊的(這個(gè)舊的是指我們自己繼承重寫的Subscriber,就是subscribe(subscriber)中的參數(shù)subscriber)蒋伦,這個(gè)新生成的Subscriber用來接收最初ObservableA發(fā)出的數(shù)據(jù)弓摘,即作為ObservableA.OnSubscribeA(···)函數(shù)的參數(shù)。
- 接下來調(diào)用新的Subscriber.onStart()痕届;
- 然后調(diào)用ObservableA.OnSubscribeA.call(新的Subscriber)韧献,這個(gè)call()就是我們自己重寫的那個(gè)。