美文网首页
2019-11-11 Rxjava 源码解析<4>

2019-11-11 Rxjava 源码解析<4>

作者: 猫KK | 来源:发表于2019-11-11 17:01 被阅读0次

前面几篇,我们大致了解了Rxjava的流程,这里来看一下rxjava中的操作符,我们来一个简单一点的操作符,map符

      var sources = object : ObservableOnSubscribe<String> {
            override fun subscribe(emitter: ObservableEmitter<String>) {
                emitter.onNext("下一步")
                emitter.onComplete()
            }
        }
        var observable = Observable.create(sources)
        var map = object : Function<String, Int> {
            override fun apply(t: String): Int {
                return 1
            }
        }
        var observable3 = observable.map(map)

map符能将我们的数据转化的任意类型,这里我们将string转成int,来看 observable.map(map)做了什么

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
        ObjectHelper.requireNonNull(mapper, "mapper is null");
        //很熟悉,返回ObservableMap对象
        return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
    }

根据前面的分析,下面就走到了ObservableMap的subscribeActual方法中

    @Override
    public void subscribeActual(Observer<? super U> t) {
        //重新subscribe
        source.subscribe(new MapObserver<T, U>(t, function));
    }

到这里就很熟悉,和前面线程的切换有点像,当调用onNext()方法时,会走到MapObserver的onNext()方法

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

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

            U v;

            try {
                //调用mapper.apply(t)方法,获取返回值
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            //调用observer的onNext,并将转化后的数据当作参数传过去
            downstream.onNext(v);
        }

通过上面可以知道使用mapper.apply(t)来进行数据类型的转化,其中mapper就是我们调用observable.map(map)的map对象,所以就走到了我们的转化方法中

      var map = object : Function<String, Int> {
            override fun apply(t: String): Int {
               //就会来到这里,这里的返回值就是observer的onNext方法接收的值
                return 1
            }
        }

到这里,map操作符就实现的类型的变化,其他的操作符,基本都是这样一个原理。

相关文章

网友评论

      本文标题:2019-11-11 Rxjava 源码解析<4>

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