Rxjava2流程初探

Rxjava2流程初探

目标

  • 了解Rxjava2 同步执行的基本流程

例子

先解释一下2个函数的作用:

  1. map是将一个数据源中每个数据转成另外一种类型。
  2. flatmap用于将一个数据源中的每个数据,转成一个新的数据源的被观察者。

看一个简单的例子:

 class Penson{
        val pList : ArrayList<Plan> = ArrayList()
 }

 class Plan {
     var plan : Int = 0
 }
 //造一些数据
  val personList = ArrayList<Penson>()
  for(z in 0..2){
       val penson = Penson()
       for (x in 0..3){
           val plan = Plan()
           plan.plan = x
           penson.pList.add(plan)
       }
       personList.add(penson)
   }
   //开始运行rxjava
   Observable.fromIterable(personList).flatMap{
        Observable.fromIterable(it.pList)
    }.map{
        "I'm plan :"+it.plan
    }.subscribe(object:Observer<String>{
        override fun onComplete() {
        }

        override fun onSubscribe(d: Disposable) {
        }

        override fun onNext(t: String) {
            println("打印"+t)
        }

        override fun onError(e: Throwable) {
        }

    })

通过这个例子来梳理一下Rxjava2的流程:

  1. 通过原始数据创建最上游的被观察者A ObservableFromIterable 。
    public static <T> Observable<T> fromIterable(Iterable<? extends T> source) {
        ObjectHelper.requireNonNull(source, "source is null");
        return RxJavaPlugins.onAssembly(new ObservableFromIterable<T>(source));
    }
  1. 被观察者A创建被观察者B ObservableFlatMap ,被观察者B持有被观察者A的引用。
    public final <R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper,
            boolean delayErrors, int maxConcurrency, int bufferSize) {
        ...
        if (this instanceof ScalarCallable) {
            ...
        }
        return RxJavaPlugins.onAssembly(new ObservableFlatMap<T, R>(this, mapper, delayErrors, maxConcurrency, bufferSize));
    }
  1. 被观察者B创建被观察者C ObservableMap,被观察者C持有被观察者B的引用。
    public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
        ObjectHelper.requireNonNull(mapper, "mapper is null");
        return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
    }
  1. 被观察者C调用subscribe函数,传入最下游的观察者。

  2. subscribe函数是Observable中的一个final方法,最后会执行Observable的subscribeActual方法,subscribeActual是一个抽象方法,具体实现在每个Observable子类。

	//Observable.java
    public final void subscribe(Observer<? super T> observer) {
        ObjectHelper.requireNonNull(observer, "...");
        try {
            observer = RxJavaPlugins.onSubscribe(this, observer);

            ObjectHelper.requireNonNull(observer, "");

            subscribeActual(observer);
        } catch (NullPointerException e) { // NOPMD
            throw e;
        } catch (Throwable e) {
            ...
        }
    }
    
    protected abstract void subscribeActual(Observer<? super T> observer);
  1. 执行被观察C的subscribeActual,它调用上游被观察者B的subscribe方法并传入一个新的观察者MapObserver,姑且叫做观察者C。观察者C对最下游观察者进行引用。
	//ObservableMap.java
    @Override
    public void subscribeActual(Observer<? super U> t) {
        source.subscribe(new MapObserver<T, U>(t, function));
    }
  1. 执行被观察者B的subscribeActual,它调用上游被观察者A的subscribe方法并传入一个新的观察者MergeObserver,姑且叫做观察者B。观察者B对下游观察者C进行引用。
	//ObservableFlatMap.java
    @Override
    public void subscribeActual(Observer<? super U> t) {

        if (ObservableScalarXMap.tryScalarXMapSubscribe(source, t, mapper)) {
            return;
        }

        source.subscribe(new MergeObserver<T, U>(t, mapper, delayErrors, maxConcurrency, bufferSize));
    }
  1. 执行被观察者A的subscribeActual,创建一个FromIterableDisposable对象并且运行run方法,从原始数据中循环取出数据并返回给下游观察者B。
//ObservableFromIterable.java
    public void subscribeActual(Observer<? super T> observer) {
        Iterator<? extends T> it;
        try {
            it = source.iterator();
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            EmptyDisposable.error(e, observer);
            return;
        }
        boolean hasNext;
        try {
            hasNext = it.hasNext();
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            EmptyDisposable.error(e, observer);
            return;
        }
        if (!hasNext) {
            EmptyDisposable.complete(observer);
            return;
        }

        FromIterableDisposable<T> d = new FromIterableDisposable<T>(observer, it);
        observer.onSubscribe(d);

        if (!d.fusionMode) {
            d.run();
        }
    }
    static final class FromIterableDisposable<T> extends BasicQueueDisposable<T> {

        final Observer<? super T> downstream;

        final Iterator<? extends T> it;

        volatile boolean disposed;

        boolean fusionMode;

        boolean done;

        boolean checkNext;

        FromIterableDisposable(Observer<? super T> actual, Iterator<? extends T> it) {
            this.downstream = actual;
            this.it = it;
        }

        void run() {
            boolean hasNext;

            do {
                if (isDisposed()) {
                    return;
                }
                T v;

                try {
                    v = ObjectHelper.requireNonNull(it.next(), "The iterator returned a null value");
                } catch (Throwable e) {
                    Exceptions.throwIfFatal(e);
                    downstream.onError(e);
                    return;
                }

                downstream.onNext(v);

                if (isDisposed()) {
                    return;
                }
                try {
                    hasNext = it.hasNext();
                } catch (Throwable e) {
                    Exceptions.throwIfFatal(e);
                    downstream.onError(e);
                    return;
                }
            } while (hasNext);

            if (!isDisposed()) {
                downstream.onComplete();
            }
        }


    }
  1. 在下游观察者B的onNext函数中,通过Function.apply函数将原始数据转成一个新的数据源的被观察者B2,就是上面flatMap中返回的Observable.fromIterable(it.pList)。用一个持有观察者B的引用的内部观察者InnerObserver对被观察者B2进行订阅,执行到InnerObserver的onNext时,再通过观察者B取出下游观察者C执行。
//MergeObserver.java
        @Override
        public void onNext(T t) {
            // safeguard against misbehaving sources
            if (done) {
                return;
            }
            ObservableSource<? extends U> p;
            try {
                p = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper returned a null ObservableSource");
            } catch (Throwable e) {
                Exceptions.throwIfFatal(e);
                upstream.dispose();
                onError(e);
                return;
            }

            if (maxConcurrency != Integer.MAX_VALUE) {
                synchronized (this) {
                    if (wip == maxConcurrency) {
                        sources.offer(p);
                        return;
                    }
                    wip++;
                }
            }

            subscribeInner(p);
        }

        @SuppressWarnings("unchecked")
        void subscribeInner(ObservableSource<? extends U> p) {
            for (;;) {
                if (p instanceof Callable) {
                    ...
                } else {
                    InnerObserver<T, U> inner = new InnerObserver<T, U>(this, uniqueId++);
                    if (addInner(inner)) {
                        p.subscribe(inner);
                    }
                    break;
                }
            }
        }
  1. 在下游观察者C的onNext函数中, 通过Function.apply函数将数据转成新的类型,然后调用最下游的观察者。
    static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
        final Function<? super T, ? extends U> mapper;

        MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
            super(actual);
            this.mapper = mapper;
        }

        @Override
        public void onNext(T t) {
            if (done) {
                return;
            }

            if (sourceMode != NONE) {
                downstream.onNext(null);
                return;
            }

            U v;

            try {
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            downstream.onNext(v);
        }

    }

总结

  1. Rxjava2从源数据开始一层层往下创建被观察者,最底层的被观察者调用subscribe订阅时,再从底层被观察者调用上一层被观察者的订阅方法,同时传入该层对应的观察者。来到最上层被观察者订阅时,再把源数据逐一返回给下一层观察者以完成整个流程。
  2. 每一层的被观察者都对应一个该层的观察者。
  3. 数据在流动的过程中,可以像flatMap那样创建一个新的被观察者取代原来的上层被观察者。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值