Rxjava2源码解析
1:用法:
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//Log.d(TAG, "ObservableEmitter");
//Log.d(TAG, "Observable thread is" + Thread.currentThread().getName());
emitter.onNext(12);
emitter.onNext(13);
emitter.onNext(14);
emitter.onNext(15);
emitter.onComplete();
}
});
Observer<Integer> observer = new Observer<Integer>() {
private int i;
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe");
mDisposable = d;
}
@Override
public void onNext(Integer integer) {
/*i++;
if(i == 3){
mDisposable.dispose();
}*/
Log.d(TAG, "onNext" + integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError");
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
};
//observable.subscribe(observer);
observable.doOnSubscribe(disposable -> {
Log.d(TAG, "doOnSubscribe");
}
).doOnComplete(() -> {
Log.d(TAG, "doOnComplete");
}).doOnNext((C) -> {
Log.d(TAG, "doNext" + C);
}).subscribe(observer);
2:Observable
首先看Observable:
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//Log.d(TAG, "ObservableEmitter");
//Log.d(TAG, "Observable thread is" + Thread.currentThread().getName());
emitter.onNext(12);
emitter.onNext(13);
emitter.onNext(14);
emitter.onNext(15);
emitter.onComplete();
}
});
看一下create:
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
参数ObservableOnSubscribe是一个接口,里面只有一个函数subscribe:
public interface ObservableOnSubscribe<T> {
/**
* Called for each Observer that subscribes.
* @param e the safe emitter instance, never null
* @throws Exception on error
*/
void subscribe(ObservableEmitter<T> e) throws Exception;
}
create需要返回的是一个Observable:
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
通过在这里可知反回的是一个Observable的继承类ObservableCreate:
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
。。。。。。。。。。
总结以上的几个类,可以归纳一下:
通过Observable.create返回一个Observable,具体是返回ObservableCreate,该类继承Observable,同时该类持有ObservableOnSubscribe,而ObservableOnSubscribe是一个接口,具体的实现是在:
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//Log.d(TAG, "ObservableEmitter");
//Log.d(TAG, "Observable thread is" + Thread.currentThread().getName());
emitter.onNext(12);
emitter.onNext(13);
emitter.onNext(14);
emitter.onNext(15);
emitter.onComplete();
}
});
Observable的解析暂时先到这里,我们先看如何和observer关联起来:
//observable.subscribe(observer);
observable.doOnSubscribe(disposable -> {
Log.d(TAG, "doOnSubscribe");
}
).doOnComplete(() -> {
Log.d(TAG, "doOnComplete");
}).doOnNext((C) -> {
Log.d(TAG, "doNext" + C);
}).subscribe(observer);
进入subscribe:
@SchedulerSupport(SchedulerSupport.NONE)
@Override
public final void subscribe(Observer<? super T> observer) {
ObjectHelper.requireNonNull(observer, "observer is null");
try {
observer = RxJavaPlugins.onSubscribe(this, observer); ObjectHelper.requireNonNull(observer, "Plugin returned null Observer"); subscribeActual(observer);
} catch (NullPointerException e) { // NOPMD
throw e;
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
// can't call onError because no way to know if a Disposable has been set or not
// can't call onSubscribe because the call might have set a Subscription already
RxJavaPlugins.onError(e); NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
npe.initCause(e);
throw npe;
}
}
可以看到这是Observable里面的一个方法,前面我们说到,create生成的是ObservableCreate,而该类继承Observable,所以我们现在就是在ObservableCreate的subscribe方法里面,看参数,传进来的是一个observer,observer也是一个interface,具体实现就是应用层的:
Observer<Integer> observer = new Observer<Integer>() {
private int i;
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe");
mDisposable = d;
}
@Override
public void onNext(Integer integer) {
/*i++;
if(i == 3){
mDisposable.dispose();
}*/
Log.d(TAG, "onNext" + integer);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError");
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
};
到这里再来总结一下,通过subscribe,就是ObservableCreate这个类(该类继承Observable,同时该类持有ObservableOnSubscribe,而ObservableOnSubscribe是一个接口)执行subscribe,传参为observer,是一个实现为用户层定义的接口。接下来就是具体看一下subscribe这个函数是如何走的:
@SchedulerSupport(SchedulerSupport.NONE)
@Override
public final void subscribe(Observer<? super T> observer) {
ObjectHelper.requireNonNull(observer, "observer is null");
try {
observer = RxJavaPlugins.onSubscribe(this, observer); ObjectHelper.requireNonNull(observer, "Plugin returned null Observer"); subscribeActual(observer);
} catch (NullPointerException e) { // NOPMD
throw e;
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
// can't call onError because no way to know if a Disposable has been set or not
// can't call onSubscribe because the call might have set a Subscription already
RxJavaPlugins.onError(e); NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
npe.initCause(e);
throw npe;
}
}
首先看:
subscribeActual(observer);
点进这个函数看到是一个Observable里面的一个abstract函数,那实现是在哪里呢,前面一直提到的,我们现在其实是处于ObservableCreate这个类,进入该类找到subscribeActual这个函数:
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent); try {
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
先看这句:
source.subscribe(parent);
先看看source是怎么来的:
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//Log.d(TAG, "ObservableEmitter");
//Log.d(TAG, "Observable thread is" + Thread.currentThread().getName());
emitter.onNext(12);
emitter.onNext(13);
emitter.onNext(14);
emitter.onNext(15);
emitter.onComplete();
}
});
一层层往上追溯可以看到sorce其实就是用户层实现的那个接口:
public interface ObservableOnSubscribe<T> {
/**
* Called for each Observer that subscribes.
* @param e the safe emitter instance, never null
* @throws Exception on error
*/
void subscribe(ObservableEmitter<T> e) throws Exception;
}
会到:
source.subscribe(parent);
这里的parent是CreateEmitter,先看subscribe:
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
//Log.d(TAG, "ObservableEmitter");
//Log.d(TAG, "Observable thread is" + Thread.currentThread().getName());
emitter.onNext(12);
emitter.onNext(13);
emitter.onNext(14);
emitter.onNext(15);
emitter.onComplete();
}
前面看到subscribe的参数是parent:
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
这里定义了一个CreateEmitter,持有observer:
implements ObservableEmitter<T>, Disposable {
private static final long serialVersionUID = -3434801548987643227L;
final Observer<? super T> observer;
CreateEmitter(Observer<? super T> observer) {
this.observer = observer;
}
@Override
public void onNext(T t) {
if (t == null) {
onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
return;
}
if (!isDisposed()) {
observer.onNext(t);
}
}
@Override
public void onError(Throwable t) {
if (t == null) {
t = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
}
if (!isDisposed()) {
try {
observer.onError(t);
} finally {
dispose();
}
} else {
RxJavaPlugins.onError(t);
}
}
@Override
public void onComplete() {
if (!isDisposed()) {
try {
observer.onComplete();
} finally {
dispose();
}
}
}
我们来看一下onNext是如何执行的,当执行到:
emitter.onNext(12);
的时候,就到了:
@Override
public void onNext(T t) {
if (t == null) {
onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
return;
}
if (!isDisposed()) {
observer.onNext(t);
}
}
看这句:
observer.onNext(t);
我们前面讲到了,这里的observer,就是用户层自定义的:
Observer<Integer> observer = new Observer<Integer>() {
private int i;
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe");
mDisposable = d;
}
@Override
public void onNext(Integer integer) {
/*i++;
if(i == 3){
mDisposable.dispose();
}*/
Log.d(TAG, "onNext" + integer);
}
到这里,Observable里面的onNext和Observer的onNext就联系起来了,Observavble发送一个,Observer执行一个。onError和onComplete同理。
Rxjava2源码解析的更多相关文章
- Android进阶:五、RxJava2源码解析 2
上一篇文章Android进阶:四.RxJava2 源码解析 1里我们讲到Rxjava2 从创建一个事件到事件被观察的过程原理,这篇文章我们讲Rxjava2中链式调用的原理.本文不讲用法,仍然需要读者熟 ...
- RxJava2 源码解析(二)
概述 承接上一篇RxJava2 源码解析(一),本系列我们的目的: 知道源头(Observable)是如何将数据发送出去的. 知道终点(Observer)是如何接收到数据的. 何时将源头和 ...
- RxJava2源码解析(二)
title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...
- Android进阶:四、RxJava2 源码解析 1
本文适合使用过Rxjava2或者了解Rxjava2的基本用法的同学阅读 一.Rxjava是什么 Rxjava在GitHub 主页上的自我介绍是 "a library for composin ...
- RxJava2 源码解析(一)
概述 最近事情太多了,现在公司内部的变动,自己岗位的变化,以及最近决定找工作.所以博客耽误了,准备面试中,打算看一看RxJava2的源码,遂有了这篇文章. 不会对RxJava2的源码逐字逐句的阅读,只 ...
- rxJava2.x源码解析
一. Rxjava是什么 Rxjava在GitHub的介绍是 "A library for composing asynchronous and event-based programs u ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
随机推荐
- Python3实战spark大数据分析及调度 ☝☝☝
Python3实战spark大数据分析及调度 ☝☝☝ 一.实例分析 1.1 数据 student.txt 1.2 代码 二.代码解析 2.1函数解析 2.1.1 collect() RDD的特性 在 ...
- Vue-CLI项目vuex仓库
0901自我总结 Vue-CLI项目vuex仓库 一.概念 vuex仓库是vue全局的数据仓库,好比一个单例,在任何组件中通过this.$store来共享这个仓库中的数据,完成跨组件间的信息交互. v ...
- ASP.NET Core API总结(一)
ASP.NET Core API 问题:当应用收到一个http请求之后,API应用程序是怎么一步步执行的. 注册服务——构造容器——使用服务——创建对象 1. 创建一个新的API之后, ...
- [Tyvj Jan]青蛙跳荷叶
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 从前,有一个小青蛙决定去荷叶上练习跳跃.现在有n个荷叶排成一排,小青蛙一开始在最左 ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- vue——父子组件间传值
(1)父组件给子组件传值(商品详情页): 根据订单类型,判断显示立即购买/立即拼单: 通过props来传递参数 父组件(商品详情页) 父组件调用子组件,在子组件的标签中,通过:数据名称=”数据”的形式 ...
- API设计中防重放攻击
HTTPS数据加密是否可以防止重放攻击? 否,加密可以有效防止明文数据被监听,但是却防止不了重放攻击. 防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你 ...
- C# 求Π Π/4=1-1/3+1/5-1/7+......+1/(2*n-3)-1/(2*n-1); (n=2000)
double a = 0.0;//最终Π的结果 double类型 int n; for (n = 1; n <= 2000; n++) { if (n % 2 == 1) { a += 1.0 ...
- 零基础教程!一文教你使用Rancher 2.3和Terraform运行Windows容器
本文来自Rancher Labs 介 绍 在Kubernetes 1.14版本中已经GA了对Windows的支持.这一结果凝结了一群优秀的工程师的努力,他们来自微软.Pivotal.VMware.红帽 ...
- java 连续数字数组分组
问题: 1. 将Lis list = Arrays.asList(1,2,3,5,8,9,10), 拆分成 [1,2,3] .[5]. [8,9,10] , 2. 再传入一个数字 9, 将匹配数字9的 ...