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源码解析的更多相关文章

  1. Android进阶:五、RxJava2源码解析 2

    上一篇文章Android进阶:四.RxJava2 源码解析 1里我们讲到Rxjava2 从创建一个事件到事件被观察的过程原理,这篇文章我们讲Rxjava2中链式调用的原理.本文不讲用法,仍然需要读者熟 ...

  2. RxJava2 源码解析(二)

    概述 承接上一篇RxJava2 源码解析(一),本系列我们的目的: 知道源头(Observable)是如何将数据发送出去的.    知道终点(Observer)是如何接收到数据的.    何时将源头和 ...

  3. RxJava2源码解析(二)

    title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...

  4. Android进阶:四、RxJava2 源码解析 1

    本文适合使用过Rxjava2或者了解Rxjava2的基本用法的同学阅读 一.Rxjava是什么 Rxjava在GitHub 主页上的自我介绍是 "a library for composin ...

  5. RxJava2 源码解析(一)

    概述 最近事情太多了,现在公司内部的变动,自己岗位的变化,以及最近决定找工作.所以博客耽误了,准备面试中,打算看一看RxJava2的源码,遂有了这篇文章. 不会对RxJava2的源码逐字逐句的阅读,只 ...

  6. rxJava2.x源码解析

    一. Rxjava是什么 Rxjava在GitHub的介绍是 "A library for composing asynchronous and event-based programs u ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

随机推荐

  1. 使用Spring-boot-starter标准改造项目内的RocketMQ客户端组件

    一.背景介绍 我们在使用Spring Cloud全家桶构建微服务应用时,经常能看到spring-boot-xxx-starter的依赖,像spring-boot-starter-web.spring- ...

  2. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

  3. .NET Core开发的iNeuOS物联网平台部署树霉派,从网关到云端整体解决方案。助力2019中国.NET峰会。

    2019 中国.NET 开发者峰会正式启动 目       录 1.      概述... 2 2.      树莓派硬件配置... 2 3.      软件信息... 3 4.      Raspb ...

  4. plSql使用流程

    1. 下载PLSQL developer.instantclient_11_2, 下载地址:https://pan.baidu.com/s/1_MjmIT4nUzsQ7Hi8MCrs1A, 备注:此安 ...

  5. ‎Cocos2d-x 学习笔记(22) TableView

    [Cocos2d-x 学习笔记 ]目录 1. 简介 TableView直接继承了ScrollView和ScrollViewDelegate.说明TableView能实现ScrollView拖动cont ...

  6. python编程系列---进程池的优越性体验

    1.通过multiprocessing.Process()类创建子进程 import multiprocessing, time, os, random def work(index): " ...

  7. jmeter-操作mysql

    1.下载mysql驱动并放至如下目录:E:\soft\apache-jmeter-5.1.1\lib\ext 2.添加JDBC Connection Configuration(线程组-配置元件-JD ...

  8. cxf 调用 .net webservice

    1.   问题背景          现在我们两套语言并行,其中必然会涉及到不同系统的相互访问. .net 的会员信息是用 webservice  提供服务的.那如何对现有 .net webservi ...

  9. Java基础(39)Arrays.binarySearch方法

    1.源码中可以看到,binarySearch方法调用了binarySearch0方法,binarySearch0方法才是标准的二分查找实现. 2.对于binarySearch0方法来说,注意最后的re ...

  10. Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)

    一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...