rxjava1源码笔记(一)
来源:互联网 发布:matlab gui 编程实例 编辑:程序博客网 时间:2024/06/07 01:21
rxjava大致流程
Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("1"); subscriber.onCompleted(); }}).subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { }});
这是一个简单的rxjava调用。
当我们调用到subscribe方法的时候,程序最终会执行到这段
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) { ... RxJavaHooks.onObservableStart(observable, observable.onSubscribe).call(subscriber); return RxJavaHooks.onObservableReturn(subscriber); ...}
这里对Observerable进行了一层封装,并最终将调用我们传入Observerable的onSubscribe对象的call方法,然后在onSubscribe对象的call方法中可以获得订阅的Subscriber对象,我们就在这里调用Subscriber的onNext方法。
rxjava中的map方法
public final <R> Observable<R> map(Func1<? super T, ? extends R> func) { return unsafeCreate(new OnSubscribeMap<T, R>(this, func));}
可以看到map方法需要我们传入一个Func1的类,然后返回一个对应变换后的Observable。
首先来介绍一下Func这个接口。RxJava中有一系列Action+数字,Func+数字的接口,这些接口中都只有一个call方法,其中Action接口的call方法都没有返回值, Func接口的call方法都有返回值,后面的那个数字表示call方法接受几个泛型类型的参数。
这里map方法接收的参数类型为Func1
public final class OnSubscribeMap<T, R> implements OnSubscribe<R>public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) { this.source = source; this.transformer = transformer;}
观察到这个类OnSubscribe的泛型是map转化后的类,这保证了rxjava的方法调用可以以链条的形式进行。
我们再看OnSubscribeMap的call方法
public void call(final Subscriber<? super R> o) { MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer); o.add(parent); source.unsafeSubscribe(parent);}
在这个方法里重新创建了一个Subscriber对象,并且订阅了之前传入的Observable,也就是说对之前Observable直接进行处理的将会是新创建的Subscriber对象,这里可以猜测到在MapSubscriber里面将会对Observable传递过来的事件进行转化后再传递订阅了该OnSubscribeMap的Subscriber对象。观察OnSubscribeMap的onNext的实现果然如此。
public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) { this.actual = actual; this.mapper = mapper; }@Overridepublic void onNext(T t) { R result; try { result = mapper.call(t); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); unsubscribe(); onError(OnErrorThrowable.addValueAsLastCause(ex, t)); return; } actual.onNext(result);}
可以看到在onNext里面通过之前传入的Func1类的call方法来对原始的事件进行加工,加工完后再传递给订阅的Subscriber对象,从而实现了事件的转化。
从上面可以看出,Observable的map方法实际上是新建了一个Observable来给下方的Subscriber订阅,并且在call方法中创建一个新的Subscriber来订阅上方的Observable,这个Subscriber收到事件再对事件进行一次加工后再通知下方的Subscriber接受加工之后的事件,从而实现一个事件的转化,并且依旧能保持函数链式调用。
- rxjava1源码笔记(一)
- RxJava使用简史(一)RxJava1的回顾
- rxjava1
- Rxjava1
- RxJava1.0 flatMap方法的源码分析
- RxJava1.x从入门到放弃再到RxJava 2.x(一)
- Rxjava1.x学习记录(一)名词及用法的简单介绍
- RxJava1.X升级到RxJava2.X笔记
- RxJava1.X升级到RxJava2.X笔记
- 1. RxJava1.x的诞生(非常重要)
- 对Rxjava1.0的map方法的源码分析
- 读STL源码剖析笔记(一)
- winvnc源码阅读笔记(一)---------线程
- 源码阅读笔记 Activity(一)
- LUA 源码阅读笔记(一)
- Hadoop HDFS源码学习笔记(一)
- Redis源码学习笔记(一)
- Hadoop源码分析笔记(一)
- Git 和 SVN 之间的五个基本区别
- Kuchiguse (20)
- Socket编程之外网访问内网
- 【算法】冒泡排序--js实现
- 自动化构建工具(gulp)
- rxjava1源码笔记(一)
- 文章标题
- 深入理解dpdk rte_ring无锁队列
- ACM1002
- Otter-入门篇3(Node搭建)
- C语言命名冲突问题
- nexus-3.6.0-02-unix.tar.gz安装(Centos下),maven setting.xml配置案例,项目root的pom.xml配置,parent-pom的pom.xml配置案例
- matlab中矩阵的操作
- 支持向量机