RxJava2 源码解析(一),只需一篇文章吃透Android多线程技术

}

返回值是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对象,如下:

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

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

Android开发除了flutter还有什么是必须掌握的吗?

相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了

除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;

经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-J4shQanL-1711803635258)]

Android开发除了flutter还有什么是必须掌握的吗?

相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了

除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;

[外链图片转存中…(img-6ZsrUDGw-1711803635259)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值