响应式编程之doOnTerminate

90 阅读1分钟
public void hystrix(String username){

    /**
     * R call();
     */
    Func0<Observable<Object>> defer = new Func0<Observable<Object>>(){
        @Override
        public Observable<Object> call() {
            System.out.println("4.username = " + username);
            return Observable.just(2);
        }
    };
    /**
     * R call(T t);
     */
    Func1<Object,Object> map = new Func1<Object,Object>(){

        @Override
        public Object call(Object observable) {
            System.out.println("5.username = " + username);
            if(observable instanceof Integer){
                return ((Integer) observable)* 3;
            }
            return null;
        }
    };

    Observable.defer(new Func0<Observable<Object>>() {
        @Override
        public Observable<Object> call() {
            System.out.println("1.username = " + username);
            return Observable.defer(new Func0<Observable<Object>>() {

                @Override
                public Observable<Object> call() {
                    return Observable.just((Object) 12).doOnTerminate(new Action0() {
                        @Override
                        public void call() {
                            System.out.println("this is doOnTerminate1");
                        }
                    });
                }
            }).doOnTerminate(new Action0() {
                @Override
                public void call() {
                    System.out.println("this is doOnTerminate2");
                }
            }).doOnCompleted(new Action0() {
                @Override
                public void call() {
                    System.out.println("this is doOnCompleted");
                }
            });
        }
    }).doOnTerminate(new Action0() {
        @Override
        public void call() {
            System.out.println("this is doOnTerminate3");
        }
    }).subscribe(new Subscriber<Object>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Object o) {
            System.out.println("this is onNext o = " + o);
        }
    });
}
1.username = ceshi
this is onNext o = 12
this is doOnTerminate1
this is doOnTerminate2
this is doOnCompleted
this is doOnTerminate3

1、OnSubscribeDoOnEach

public final Observable<T> doOnTerminate(final Action0 onTerminate) {
    Action1<T> onNext = Actions.empty();
    Action1<Throwable> onError = Actions.toAction1(onTerminate);

    Observer<T> observer = new ActionObserver<T>(onNext, onError, onTerminate);

    return unsafeCreate(new OnSubscribeDoOnEach<T>(this, observer));
}
public OnSubscribeDoOnEach(Observable<T> source, Observer<? super T> doOnEachObserver) {
    this.source = source;
    this.doOnEachObserver = doOnEachObserver;
}

2、DoOnEachSubscriber

private static final class DoOnEachSubscriber<T> extends Subscriber<T> {

    private final Subscriber<? super T> subscriber;
    private final Observer<? super T> doOnEachObserver;

    private boolean done;

    DoOnEachSubscriber(Subscriber<? super T> subscriber, Observer<? super T> doOnEachObserver) {
        super(subscriber);
        this.subscriber = subscriber;
        this.doOnEachObserver = doOnEachObserver;
    }

    @Override
    public void onCompleted() {
        if (done) {
            return;
        }
        try {
            //doOnTerminate、doOnCompleted都会此处执行,同时存在前提下谁在前谁优先执行
            doOnEachObserver.onCompleted();
        } catch (Throwable e) {
            Exceptions.throwOrReport(e, this);
            return;
        }
        // Set `done` here so that the error in `doOnEachObserver.onCompleted()` can be noticed by observer
        done = true;
        subscriber.onCompleted();
    }

    @Override
    public void onError(Throwable e) {
        if (done) {
            RxJavaHooks.onError(e);
            return;
        }
        done = true;
        try {
            doOnEachObserver.onError(e);
        } catch (Throwable e2) {
            Exceptions.throwIfFatal(e2);
            subscriber.onError(new CompositeException(Arrays.asList(e, e2)));
            return;
        }
        subscriber.onError(e);
    }

    @Override
    public void onNext(T value) {
        if (done) {
            return;
        }
        try {
            doOnEachObserver.onNext(value);
        } catch (Throwable e) {
            Exceptions.throwOrReport(e, this, value);
            return;
        }
        subscriber.onNext(value);
    }
}

总结:一个被观察者Observable中可能包含多个被观察者Observable,不同Observable有理到外顺序执行。具体Observable存在多个操作符,则根据其操作符功能控制不同操作符执行顺序。