RxJava2 源码解析(一),看这篇文章就行了

本文详细剖析了RxJava库中`Observable.create`方法的工作原理,介绍了ObservableOnSubscribe接口和Emitter接口的作用,以及如何通过适配器模式将ObservableOnSubscribe转换为Observable。同时讨论了订阅过程中的hook机制和知识框架的重要性,对于Android开发者提升技能具有指导意义。
摘要由CSDN通过智能技术生成

从create开始。


这是一段不涉及操作符和线程切换的简单例子:

Observable.create(new ObservableOnSubscribe() {

@Override

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);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

要如何成为Android架构师?

搭建自己的知识框架,全面提升自己的技术体系,并且往底层源码方向深入钻研。
大多数技术人喜欢用思维脑图来构建自己的知识体系,一目了然。这里给大家分享一份大厂主流的Android架构师技术体系,可以用来搭建自己的知识框架,或者查漏补缺;

对应这份技术大纲,我也整理了一套Android高级架构师完整系列的视频教程,主要针对3-5年Android开发经验以上,需要往高级架构师层次学习提升的同学,在这里点击GitHub免费分享,希望能帮你突破瓶颈,跳槽进大厂;

最后我必须强调几点:

1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。
2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识
3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。

你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境

(img-rhC1XwNO-1710848064482)]

对应这份技术大纲,我也整理了一套Android高级架构师完整系列的视频教程,主要针对3-5年Android开发经验以上,需要往高级架构师层次学习提升的同学,在这里点击GitHub免费分享,希望能帮你突破瓶颈,跳槽进大厂;

最后我必须强调几点:

1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。
2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识
3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。

你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值