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,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
随机推荐
- C语言-查找一个元素在数组中的位置
#include<stdio.h> #include <stdlib.h> #include <time.h> int search(int key, int a[ ...
- DCL语句
DCL语句我们现在默认使用的都是root用户,超级管理员,拥有全部的权限.但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库.所以,我们应该可以根据不同的项目建立不同的用户,分配不同 ...
- .net core 3.0 WPF中使用FolderBrowserDialog
前言 随着.net core 3.0 的发布,WPF 也可以在 core 平台上使用了.当前的 WPF 不支持跨平台,仅能够在 Windows 平台上使用.如果想体验 WPF 跨平台开发,可以访问开源 ...
- [JZOJ5773]【NOIP2008模拟】简单数学题
Description 话说, 小X是个数学大佬,他喜欢做数学题.有一天,小X想考一考小Y.他问了小Y一道数学题.题目如下: 对于一个正整数N,存在一个正整数T(0<T&l ...
- Unity - Raycast 射线检测
本文简要分析了Unity中射线检测的基本原理及用法,包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 SphereCast 球体投射 OverlapSphere ...
- c++11::std::remove_reference
引用移除 : remove_reference 引用折叠规则 A& & 折叠成 A& A& && 折叠成 A& A&& &a ...
- webpack 打包 todolist 应用
写在前面的话: 一直想着手动配置webpack实现应用,正好最近这段时间比较空闲,就写了一个通过webpack打包实现todolist的简单应用.本文内容包括:通过webpack打包css,html ...
- CVE 2019-0708漏洞复现防御修复
CVE-2019-0708 Windows再次被曝出一个破坏力巨大的高危远程漏洞CVE-2019-0708.攻击者一旦成功利用该漏洞,便可以在目标系统上执行任意代码,包括获取敏感信息.执行远程代码.发 ...
- pytest3-命令行选项
1.pytest -h 查看pytest常用命令 E:\myproj\pytest_demo>pytest -h usage: pytest [options] [file_or_dir] [f ...
- 在Spring Boot项目中使用Spock测试框架
本文首发于个人网站:在Spring Boot项目中使用Spock测试框架 Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring Boot项目 ...