RxJava2,2024教资笔试面试

public void onComplete() {

Log.v(“RxJavaTest”,“onComplete”);

}

});

二.源码解析


下面我们就从上述代码开始我们的源码解析。我们将上诉代码分三个步骤来解析:

1.调用Observable.create()方法

我们将这一步拆分成若干方法来讲解。

- (1)new ObservableOnSubscribe()

首先创建了一个ObservableOnSubscribe对象,可以理解为发送事件的上游,通过匿名内部类的方式。ObservableOnSubscribe是一个接口内部定义了一个方法subscribe()。

- (2)Observable.create()创建一个被观察者

源码如下:

public static Observable create(ObservableOnSubscribe source) {

ObjectHelper.requireNonNull(source, “source is null”);

//就是返回一个ObservableCreate对象

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

}

public static Observable onAssembly(@NonNull Observable source) {

//默认onObservableAssembly为null。

Function<? super Observable, ? extends Observable> f = onObservableAssembly;

if (f != null) {

return apply(f, source);

}

//直接返回source.即传入得ObservableCreate对象。

return source;

}

- (3)new ObservableCreate(source)

我们来看看通过构造方法创建的ObservableCreate对象是个什么东西。

public final class ObservableCreate extends Observable {

final ObservableOnSubscribe source;

public ObservableCreate(ObservableOnSubscribe source) {

//ObservableCreate内部的成员变量就是上述创建的ObservableOnSubscribe对象

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

}

}

…省略部分代码

}

根据代码我们清楚的看到这个类复写了父类Observable的***subscribeActual()***方法,做了自己实现,实现内容我们下面在做分析。

到这一步我们可以知道,Observable.create()方法其实就是返回了一个ObservableCreate对象,对象内部通过一个成员变量source保存我们传入的ObservableOnSubscribe对象,也可以理解为我们的被观察者,ObservableCreate只是在我们的被观察者对象外面包装了一层。

2.调用new Observer();创建了一个观察者

Observer是一个接口,内部定义了四个方法。这里通过匿名内部类的方式创建了一个观察者。

public interface Observer {

void onSubscribe(@NonNull Disposable d);

void onNext(@NonNull T t);

void onError(@NonNull Throwable e);

void onComplete();

}

3.subscribe()建立订阅关系

(1)Observable.subscribe()方法

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

//校验输入的观察者不能为null

ObjectHelper.requireNonNull(observer, “observer is null”);

try {

//这里直接理解为返回传入的观察者

//和上面创建被观察者逻辑一样

observer = RxJavaPlugins.onSubscribe(this, observer);

ObjectHelper.requireNonNull(observer, “The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins”);

//直接调用ObservableCreate的subscribeActual()方法,这个方法传入了一个观察者。

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;

}

}

由上述代码我们可以知道,当我们调用subscribe()方法建立订阅关系的时候,其实就是调用我们第一步创建的ObservableCreate对象内部重写的subscribeActual()方法传入了一个观察者,下面我们来分析subscribeActual()方法的实现。

(2).ObservableCreate.subscribeActual()

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

//通过传入的观察者对象创建一个事件发射器

CreateEmitter parent = new CreateEmitter(observer);

//调用观察者的onSubscribe()方法,传入一个发射器。

observer.onSubscribe(parent);

try {

//source对象,就是传入的被ObservableOnSubscribe对象

//调用它的subscribe()方法传入一个事件发射器

source.subscribe(parent);

} catch (Throwable ex) {

Exceptions.throwIfFatal(ex);

parent.onError(ex);

}

}

(3)new CreateEmitter(observer)

下面我们来看看CreateEmitter的内部实现。

static final class CreateEmitter

extends AtomicReference

implements ObservableEmitter, 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()) {

//调用观察者的onNext()方法

observer.onNext(t);

}

}

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

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

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

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

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

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

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

image

大厂面试真题

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

《2017-2021字节跳动Android面试历年真题解析》

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
d面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-Wn3K3zqn-1712806359495)]

《2017-2021字节跳动Android面试历年真题解析》

[外链图片转存中…(img-wC79mOyF-1712806359495)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-qFZebNEV-1712806359496)]

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值