RX学习笔记之map变换

首先在一个最简单的map变换

oneMapSubscription = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                printLog("onStart in OnSubscribe");
                subscriber.onStart();
                int N = data.length;
                for (int i = 0; i < N; i++) {
                    printLog("onNext " + data[i] + " in OnSubscribe");
                    subscriber.onNext(data[i]);
                }
                printLog("OnCompleted in OnSubscribe");
                subscriber.onCompleted();

            }
        }).map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                String result = s + "a";
                printLog(result);
                return result;
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                printLog("OnCompleted in Subscriber");


            }

            @Override
            public void onError(Throwable e) {
                printLog("onError in Subscriber");

            }

            @Override
            public void onNext(String s) {
                printLog("onNext " + s + " in Subscriber");

            }
        });

我们知道rxjava中几个关键对象,observable,onSubscribe ,Subscriber,这三个对象相互联系组成rxjava的链式结构。map变换总共有3步。
1.代码首先在create方法中生成了两个对象,observable,onSubscribe,并将onSubscribe存入全局变量中。

2.map方法调用lift方法并传入一个OperatorMap并把外面重写的fun1存入OperatorMap作为transformer。list方法又重新生成了OnSubscribeLift并把第一步存入的onSubscribe传入,然后将全局的onSubscribe设置为当前生成的OnSubscribeLift。这两步都没有开始做变换,只是将变量初始化好。

3.subscribe方法,该方法会调用全局的onSubscribe的call方法,传入subscribe方法的参数也就是最终的subscribe对象,onSubscribe也就是第二步的OnSubscribeLift。OnSubscribeLift的call方法会调用operator的call方法,operator也就是第二步生成的OperatorMap。这个方法返回一个Subscriber对象st,这个对象里保存了map方法里的重写的fun1也就是transformer,以及最终的subscribe对象。onSubscribe的call随后接着调用第一步生成的onSubscribe的call方法,并传入st。饶了半天终于绕回第一个creat里的参数了,但是这里传入的subscriber不是最终的subscriber,而是st,我们再看st的onNext方法,该方法就是将参数传入transformer的call方法中生成最终的值,然后在调用的actual也就是最终subscriber的onNext方法。

饶了半天终于绕回来了,写一篇笔记稍微记录一下,懒得上图了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值