首先在一个最简单的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方法。
饶了半天终于绕回来了,写一篇笔记稍微记录一下,懒得上图了。