個人博客地址 http://dandanlove.com/
前言
我們在使用 RxJava
的時候必不可少的會使用一些基礎的操作符, map
、 flatMap
、 filter
等。這些都是對 Obserbable
進行各種各樣的變化,我們查看其實現都能看到一個叫做 lift
的操作符。
lift源碼
我們先看源碼(rxjava:1.3.0),再通過一個例子來熟悉、掌握。
public interface Func1<T, R> extends Function {
R call(T t);
}
//注意操作符的入參和出參都是Subscriber
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) {
//創建新的Observable,OnSubscribeLift代替原理的onSubscribe
return unsafeCreate(new OnSubscribeLift<T, R>(onSubscribe, operator));
}
public final class OnSubscribeLift<T, R> implements OnSubscribe<R> {
//上一層的Observable的onSubscribe
final OnSubscribe<T> parent;
//需要變換的操作符
final Operator<? extends R, ? super T> operator;
public OnSubscribeLift(OnSubscribe<T> parent, Operator<? extends R, ? super T> operator) {
this.parent = parent;
this.operator = operator;
}
@Override
public void call(Subscriber<? super R> o) {
try {
//調用操作符的call方法,operator.call
Subscriber<? super T> st = RxJavaHooks.onObservableLift(operator).call(o);
try {
st.onStart();
parent.call(st);
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
st.onError(e);
}
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
o.onError(e);
}
}
}
源碼解讀
以上爲 lift
操作相關的代碼,我們先不管泛型中的 R
、 T
之類的,這種情況下根據泛型去推到容易讓其更加的複雜。所以我們先簡化一下代碼:
public <R> Observable<R> lift(Operator<? extends R, ? super T> operator) {
return Observable.create(new OnSubscribe<R>() {
@Override
public void call(Subscriber subscriber) {
Subscriber newSubscriber = operator.call(subscriber);
newSubscriber.onStart();
onSubscribe.call(newSubscriber);
}
});
}
圖片來自:扔物線 - 給 Android 開發者的 RxJava 詳解
簡單的來看,以上過程產生了兩個 Observable
和 OnSubscribe
:
- 創建了一個新的
Observable
; - 新的
Observable
的成員變量onSubscribe
變化成了OnSubscribeLift
; - 進過操作符
operator
變換之後的newSubscribe
,變成的原來的Obserbable
的訂閱者; - 操作符
operator
之後的訂閱者,訂閱的是新的Observable
;
整個實現 lift()
的過程,有點像一種代理機制,通過事件攔截和處理實現事件序列的變換。我們舉個生活中的例子加深一下印象:
小明需要買一個冰淇淋,他不用去冰淇淋製造廠;
冰淇淋製造廠將製造出的冰淇淋,交給商店進行售賣;
商店進購了冰淇淋之後,買給了小明;
這裏 商店
相當於一個 lift()
操作符。
小明
訂閱 冰淇淋
的過程: 商店
訂閱了 工廠
的 冰淇淋
, 小明
訂閱了 商店
的 冰淇淋
。
這麼通俗的講解相比大家都對 lift
已經印象非常深刻了吧!
文章到這裏就全部講述完啦,若有其他需要交流的可以留言哦!!
想閱讀作者的更多文章,可以查看我 個人博客 和公共號: