响应式编程之Lift

78 阅读2分钟
public static void subscriber3(){

        Observable.just(1,2,3)// #2
                .filter(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        System.out.println("this is filter value = " + integer);
                        return integer >1;
                    }
                })
                .map(new Func1<Integer, Object>() {
                    @Override
                    public Object call(Integer integer) {
                        System.out.println("this is map value = " + integer);
                        return integer * 2;
                    }
                })
                .lift(new Observable.Operator<Object, Object>() {
                    @Override
                    public Subscriber<? super Object> call(Subscriber<? super Object> subscriber) {
                        System.out.println("this is lift");
                        return new Subscriber<Object>() {// #1
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onNext(Object o) { // #3
                                System.out.println("this is lift onNext value = " + o);
                                subscriber.onNext(o);//此处调用 #4
                            }
                        };
                    }
                })
                .subscribe(item ->{
                    System.out.println(item);// #4
                });

    }

在rxJava1.0中中间操作符构造方法,以Map操作符为例:

public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
    // this 指上流中间操作符,示例中指Filter相关Observable
    return unsafeCreate(new OnSubscribeMap<T, R>(this, func));
}
public OnSubscribeMap(Observable<T> source, Func1 transformer) {
    this.source = source;
    this.transformer = transformer;
}
public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
    return new Observable<T>(RxJavaHooks.onCreate(f));
}
protected Observable(OnSubscribe<T> f) {
    this.onSubscribe = f;
}

1、订阅过程

static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
    // new Subscriber so onStart it
    subscriber.onStart();
    if (!(subscriber instanceof SafeSubscriber)) {
        subscriber = new SafeSubscriber<T>(subscriber);
    }
    // observable.onSubscribe 指 OnSubscribeLift
    RxJavaHooks.onObservableStart(observable,observable.onSubscribe)
    .call(subscriber);
    return RxJavaHooks.onObservableReturn(subscriber);
}

1.1、OnSubscribeLift

public void call(Subscriber<? super R> o) {
    Subscriber<? super T> st = RxJavaHooks.onObservableLift(operator).call(o);//调用 #1
    st.onStart();
    parent.call(st);// parent指代 OnSubscribeMap
}

1.2、OnSubscribeMap

public void call(final Subscriber<? super R> o) {
    MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
    o.add(parent);
    // source 指代 OnSubscribeFilter  策略模式:调用抽象类Observable#unsafeSubscribe
    source.unsafeSubscribe(parent);
}
public void setProducer(Producer p) {
    actual.setProducer(p);//actual:OnSubscribeLift中Subscriber #1
}

存在订阅者Subscriber相关的静态内部类:MapSubscriber。

public void onNext(T t) {
    R result = mapper.call(t);
    actual.onNext(result);// OnSubscribeLift操作符相关Subscriber的onNext,也即调用 #3
}

1.3、OnSubscribeFilter

public void call(final Subscriber<? super T> child) {
    FilterSubscriber<T> parent = new FilterSubscriber<T>(child, predicate);
    child.add(parent);
    //  source 指代 OnSubscribeFromArray
    source.unsafeSubscribe(parent);
}
public void setProducer(Producer p) {
    super.setProducer(p);
    actual.setProducer(p);//actual:OnSubscribeMap
}

存在订阅者Subscriber相关的静态内部类:FilterSubscriber。

public void onNext(T t) {
    boolean result = predicate.call(t);
    if (result) {
        actual.onNext(t);// MapSubscriber#onNext
    } else {
        request(1);
    }
}

1.4、OnSubscribeFromArray

public void call(Subscriber<? super T> child) {
    // child:OnSubscribeFilter
    child.setProducer(new FromArrayProducer<T>(child, array));
}
public void request(long n) {
    if (n == Long.MAX_VALUE) {
        if (BackpressureUtils.getAndAddRequest(this, n) == 0) {
            fastPath();//背压策略
        }
    }
}
void fastPath() {
    final Subscriber<? super T> child = this.child;

    for (T t : array) {//遍历初始化元素
        if (child.isUnsubscribed()) {
            return;
        }
        child.onNext(t);
    }
    if (child.isUnsubscribed()) {
        return;
    }
    child.onCompleted();
}

2、Observable

public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
   subscriber.onStart();
    // allow the hook to intercept and/or decorate
    // onSubscribe:OnSubscribeFilter#call
    RxJavaHooks.onObservableStart(this, onSubscribe).call(subscriber);
    return RxJavaHooks.onObservableReturn(subscriber);
}

3、Subscriber

public abstract class Subscriber<T> implements Observer<T>, Subscription {

    public void setProducer(Producer p) {
        long toRequest;
        boolean passToSubscriber = false;
        ...
        if (passToSubscriber) {
            subscriber.setProducer(producer);
        } else {
            if (toRequest == NOT_SET) {//类似背压策略 #2数组元素
                producer.request(Long.MAX_VALUE);//producer:FromArrayProducer
            } else {
                producer.request(toRequest);
            }
        }
    }
}
void fastPath() {
    final Subscriber<? super T> child = this.child;

    for (T t : array) {
        if (child.isUnsubscribed()) {
            return;
        }
        // child:FilterSubscriber # onNext
        child.onNext(t);
    }

    if (child.isUnsubscribed()) {
        return;
    }
    child.onCompleted();
}