RxJava2 源码解析(一)

public void subscribe(ObservableEmitter e) throws Exception {

e.onNext(“1”);

e.onComplete();

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

Log.d(TAG, “onSubscribe() called with: d = [” + d + “]”);

}

@Override

public void onNext(String value) {

Log.d(TAG, “onNext() called with: value = [” + value + “]”);

}

@Override

public void onError(Throwable e) {

Log.d(TAG, “onError() called with: e = [” + e + “]”);

}

@Override

public void onComplete() {

Log.d(TAG, “onComplete() called”);

}

});

拿 create来说,

public static Observable create(ObservableOnSubscribe source) {

//…

return RxJavaPlugins.onAssembly(new ObservableCreate(source));

}

返回值是Observable,参数是ObservableOnSubscribe,定义如下:

public interface ObservableOnSubscribe {

void subscribe(ObservableEmitter e) throws Exception;

}

ObservableOnSubscribe是一个接口,里面就一个方法,也是我们实现的那个方法:

该方法的参数是 ObservableEmitter,我认为它是关联起 Disposable概念的一层:

public interface ObservableEmitter extends Emitter {

void setDisposable(Disposable d);

void setCancellable(Cancellable c);

boolean isDisposed();

ObservableEmitter serialize();

}

ObservableEmitter也是一个接口。里面方法很多,它也继承了 Emitter<T> 接口。

public interface Emitter {

void onNext(T value);

void onError(Throwable error);

void onComplete();

}

Emitter<T>定义了 我们在ObservableOnSubscribe中实现subscribe()方法里最常用的三个方法。

好,我们回到原点,create()方法里就一句话return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));,其中提到RxJavaPlugins.onAssembly():

/**

  • Calls the associated hook function.

  • @param the value type

  • @param source the hook’s input value

  • @return the value returned by the hook

*/

@SuppressWarnings({ “rawtypes”, “unchecked” })

public static Observable onAssembly(Observable source) {

Function<Observable, Observable> f = onObservableAssembly;

if (f != null) {

return apply(f, source);

}

return source;

}

可以看到这是一个关于hook的方法,关于hook我们暂且不表,不影响主流程,我们默认使用中都没有hook,所以这里就是直接返回source,即传入的对象,也就是new ObservableCreate<T>(source).

ObservableCreate我认为算是一种适配器的体现,create()需要返回的是Observable,而我现在有的是(方法传入的是)ObservableOnSubscribe对象,ObservableCreateObservableOnSubscribe适配成Observable

其中subscribeActual()方法表示的是被订阅时真正被执行的方法,放后面解析:

public final class ObservableCreate extends Observable {

final ObservableOnSubscribe source;

public ObservableCreate(ObservableOnSubscribe source) {

this.source = source;

}

@Override

protected void subscribeActual(Observer<? super T> observer) {

CreateEmitter parent = new CreateEmitter(observer);

observer.onSubscribe(parent);

try {

source.subscribe(parent);

} catch (Throwable ex) {

Exceptions.throwIfFatal(ex);

parent.onError(ex);

}

}

OK,至此,创建流程结束,我们得到了Observable<T>对象,其实就是ObservableCreate<T>.

到订阅subscribe 结束


subscribe():

public final void subscribe(Observer<? super T> observer) {

try {

//1 hook相关,略过

observer = RxJavaPlugins.onSubscribe(this, observer);

//2 真正的订阅处

subscribeActual(observer);

} catch (NullPointerException e) { // NOPMD

throw e;

} catch (Throwable e) {

//3 错误处理,

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

//4 hook错误相关,略过

RxJavaPlugins.onError(e);

NullPointerException npe = new NullPointerException(“Actually not, but can’t throw other exceptions due to RS”);

npe.initCause(e);

throw npe;

}

}

关于hook的代码:

可以看到如果没有hook,即相应的对象是null,则是传入什么返回什么的

/**

  • Calls the associated hook function.

  • @param the value type

  • @param source the hook’s input value

  • @param observer the observer

  • @return the value returned by the hook

*/

@SuppressWarnings({ “rawtypes”, “unchecked” })

public static Observer<? super T> onSubscribe(Observable source, Observer<? super T> observer) {

//1 默认onObservableSubscribe(可理解为一个flatmap的操作)是null

BiFunction<Observable, Observer, Observer> f = onObservableSubscribe;

//2 所以这句跳过,不会对其进行apply

if (f != null) {

return apply(f, source, observer);

}

//3 返回参数2

return observer;

}

我也是验证了一下 三个Hook相关的变量,确实是null:

Consumer errorHandler = RxJavaPlugins.getErrorHandler();

BiFunction<Observable, Observer, Observer> onObservableSubscribe = RxJavaPlugins.getOnObservableSubscribe();

Function<Observable, Observable> onObservableAssembly = RxJavaPlugins.getOnObservableAssembly();

Log.e(TAG, “errorHandler = [” + errorHandler + “]”);

Log.e(TAG, “onObservableSubscribe = [” + onObservableSubscribe + “]”);

Log.e(TAG, “onObservableAssembly = [” + onObservableAssembly + “]”);

所以订阅时的重点就是:

//2 真正的订阅处

subscribeActual(observer);

我们将第一节提到的ObservableCreate里的subscribeActual()方法拿出来看看:

@Override

protected void subscribeActual(Observer<? super T> observer) {

//1 创建CreateEmitter,也是一个适配器

CreateEmitter parent = new CreateEmitter(observer);

//2 onSubscribe()参数是Disposable ,所以CreateEmitter可以将Observer->Disposable 。还有一点要注意的是onSubscribe()是在我们执行subscribe()这句代码的那个线程回调的,并不受线程调度影响。

observer.onSubscribe(parent);

try {

//3 将ObservableOnSubscribe(源头)与CreateEmitter(Observer,终点)联系起来

source.subscribe(parent);

} catch (Throwable ex) {

Exceptions.throwIfFatal(ex);

//4 错误回调

parent.onError(ex);

}

}

Observer是一个接口,里面就四个方法,我们在开头的例子中已经全部实现(打印Log)。

public interface Observer {

void onSubscribe(Disposable d);

void onNext(T value);

void onError(Throwable e);

void onComplete();

}

重点在这一句:

//3 将ObservableOnSubscribe(源头)与CreateEmitter(Observer,终点)联系起来

source.subscribe(parent);

sourceObservableOnSubscribe对象,在本文中是:

new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter e) throws Exception {

e.onNext(“1”);

e.onComplete();

}

}

则会调用parent.onNext()parent.onComplete()parentCreateEmitter对象,如下:

static final class CreateEmitter

extends AtomicReference

implements ObservableEmitter, Disposable {

final Observer<? super T> observer;

CreateEmitter(Observer<? super T> observer) {

this.observer = observer;

}

@Override

public void onNext(T t) {

//如果没有被dispose,会调用Observer的onNext()方法

if (!isDisposed()) {

observer.onNext(t);

}

}

@Override

public void onError(Throwable t) {

//1 如果没有被dispose,会调用Observer的onError()方法

if (!isDisposed()) {

try {

observer.onError(t);

} finally {

//2 一定会自动dispose()

dispose();

}

} else {

//3 如果已经被dispose了,会抛出异常。所以onError、onComplete彼此互斥,只能被调用一次

RxJavaPlugins.onError(t);

}

}

@Override

public void onComplete() {

//1 如果没有被dispose,会调用Observer的onComplete()方法

if (!isDisposed()) {

try {

observer.onComplete();

} finally {

//2 一定会自动dispose()

最后

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
void onComplete() {

//1 如果没有被dispose,会调用Observer的onComplete()方法

if (!isDisposed()) {

try {

observer.onComplete();

} finally {

//2 一定会自动dispose()

最后

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-sWI54H0r-1715873195205)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值