小明要喫冰淇淋之RxJava:lift原理

個人博客地址 http://dandanlove.com/

前言

關於RxJava的基礎心法解析

我們在使用 RxJava 的時候必不可少的會使用一些基礎的操作符, mapflatMapfilter 等。這些都是對 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 操作相關的代碼,我們先不管泛型中的 RT 之類的,這種情況下根據泛型去推到容易讓其更加的複雜。所以我們先簡化一下代碼:

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);
        }
    });
}

lift

圖片來自:扔物線 - 給 Android 開發者的 RxJava 詳解

簡單的來看,以上過程產生了兩個 ObservableOnSubscribe :

  • 創建了一個新的 Observable ;
  • 新的 Observable 的成員變量 onSubscribe 變化成了 OnSubscribeLift
  • 進過操作符 operator 變換之後的 newSubscribe ,變成的原來的 Obserbable 的訂閱者;
  • 操作符 operator 之後的訂閱者,訂閱的是新的 Observable ;

整個實現 lift() 的過程,有點像一種代理機制,通過事件攔截和處理實現事件序列的變換。我們舉個生活中的例子加深一下印象:

小明需要買一個冰淇淋,他不用去冰淇淋製造廠;
冰淇淋製造廠將製造出的冰淇淋,交給商店進行售賣;
商店進購了冰淇淋之後,買給了小明;

這裏 商店 相當於一個 lift() 操作符。
小明 訂閱 冰淇淋 的過程: 商店 訂閱了 工廠冰淇淋小明 訂閱了 商店冰淇淋

這麼通俗的講解相比大家都對 lift 已經印象非常深刻了吧!

文章到這裏就全部講述完啦,若有其他需要交流的可以留言哦

想閱讀作者的更多文章,可以查看我 個人博客 和公共號:

振興書城

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章