目录
RxJava简介
RxJava是现在大火的一个异步框架,他代码简洁好懂,功能强大,扩展性高,维护难度小。
RxJava最具特色的就是他的类型变换了,这是RxJava最难理解的一部分,也是RxJava最精髓的一部分。
使用过RxJava的同学都知道RxJava的整体操作是基于观察者模式构建的。先创建Observable(被观察者),然后创建Subscriber(观察者),通过调用Observable的subscriber方法来回调传入的Subscriber对象的方法。
RxJava源码分析(map方法)
简单示例
来看看今天的主角代码吧。
public class RxJavaTest_1 {
public static void main(String[] args) {
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("00123");
}
}).map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return Integer.valueOf(s);
}
})
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("success");
}
@Override
public void onError(Throwable throwable) {
System.out.println("error");
}
@Override
public void onNext(Integer s) {
System.out.println(s);
}
});
}
}
这里Observable只能回调类型参数为String的Subscriber。但是偏偏我传入的Subscriber都是类型参数为Integer的,这就需要一个类型转换了,把String类型的参数转换为Intger型,再用这个参数去回调Subscriber的方法。这次我们研究的就是这个转换过程。
源码分析
首先毋庸置疑的,转换的核心是map()方法。
首先需要一个Fun对象作为参数,这个对象的Call方法能接受一个String类型,返回一个Integer类型的结果。我们马上就能推断出RxJava框架肯定是先把String参数传入这个转换器,然后用Integer类型的返回值去回调Subscriber的方法。
没错,的确是这样,但现在要理清其中的细节。
进入map方法。
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
return this.lift(new OperatorMap(func));
}
这里先通过Fun1生成一个OperatorMap对象。
这个OperatorMap对象是干什么的呢?
public final class OperatorMap<T, R> implements Operator<R, T> {
final Func1<? super T, ? extends R> transformer;
public OperatorMap(Func1<? super T, ? extends R> transformer) {
//保存传入的Fun1对象
this.transformer = transformer;
}
public Subscriber<? super T> call(final Subscriber<? super R> o) {
return new Subscriber<T>(o) {
public void onCompleted() {