美文网首页
小明要吃冰淇淋之RxJava:lift原理

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

作者: 静默加载 | 来源:发表于2019-01-14 20:15 被阅读5次

    个人博客地址 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 已经印象非常深刻了吧!

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

    想阅读作者的更多文章,可以查看我 个人博客 和公共号:

    振兴书城

    相关文章

      网友评论

          本文标题:小明要吃冰淇淋之RxJava:lift原理

          本文链接:https://www.haomeiwen.com/subject/btzjdqtx.html