RxJava面经一,拿去,不谢!

您所在的位置:网站首页 rxjava面试题 RxJava面经一,拿去,不谢!

RxJava面经一,拿去,不谢!

2023-05-11 16:22| 来源: 网络整理| 查看: 265

大家都知道RxJava上手是非常难的一个框架,为什么说是难呢,因为它的功能非常强大,各种操作符让人很难上手,搭配使用带生命周期的框架有RxLife等。以至于后面出了很多类似Rxjava的框架,有RxAndroid,我们用的RxJava切换主线程就是出自该框架,后面ACC架构中有LiveData、Lifecycle、包括后面协成中出来的flow异步流,都是向Rxjava靠拢,不过ACC出来的这些框架他们最大的特点就是操作简单,上手简单。所以RxJava强大的框架背后读懂源码是非常难的,因此秉着扒开源码的想法,探索一些RxJava平时的疑惑。

在Rxjava里面有几个角色我们需要弄明白:

Observable:俗称被订阅者,被订阅者是事件的来源,接收订阅者(Observer)的订阅,然后通过发射器(Emitter)发射数据给订阅者。 Observer:俗称订阅者,注册过程传给被订阅者,订阅者监听开始订阅,监听订阅过程中会把Disposable传给订阅者,然后在被订阅者中的发射器(Emitter)发射数据给订阅者(Observer)。 Emitter:俗称发射器,在发射器中会接收下游的订阅者(Observer),然后在发射器相应的方法把数据传给订阅者(Observer)。 Consumer:俗称消费器,这是RxJava2.0才出来的,在RxJava1.0中用Action来表示,消费器其实是Observer的一种变体,Observer的每一个方法都会对应一个Consumer,比如Observer的onNext、onError、onComplete、onSubscribe都会对应一个Consumer。 Disposable:是释放器,通常有两种方式会返回Disposable,一个是在Observer的onSubscribe方法回调回来,第二个是在subscribe订阅方法传consumer的时候会返回。

这里以一种最基本的订阅来介绍它们之间的关系:

首先在①、②、③这几个过程中会形成一个从Observer到Observable订阅的过程,首先是下游的Observer发起Observable的subscribe方法,而该方法会调用到Observable的subscribeActual,并且会把下游的Observer传给该方法中,这就是上面的过程①。 过程②中会创建发射器,也就是各种Emitter对象,该发射器需要接受过程①中的Observer,也就是下游的观察者,接着给下游的Observer的添加订阅的监听,也就是onSubscribe方法,并且把Disposable传给onSubscribe方法,这里的Disposable其实是刚才创建的发射器,因为本身发射器也是实现了Disposable类型,所以下游的Observer在订阅监听中会收到上游创建的Disposable。 在过程②中做完了下游的Observer订阅监听后,继续向上一层的Observable添加订阅,也就是把②中创建的发射器或②中创建的Observer传给上游的Observable的subscribe方法。 完成了上面的从下游的observer到上游的Observable订阅的过程,接着就是④发射数据了,由于最上游的Observable会在subscribe方法中收到发射器,因此我们可以利用发射器把数据发送到下游的Observer,也就是onNext、onError、onComplete等方法。

注:该篇源码分析会基于3.0.7版本分析,如果看其他版本点击官网

该篇文章会通过源码的形式介绍一下几点,以及总结面试过程中如何应答RxJava的问题

目录 RxJava怎么通过被订阅者传给订阅者的过程是什么样的? Observer处理完onComplete后会还能onNext吗? RxJava中map、flatMap的区别,你还用过其他哪些操作符? Maybe、Single、Flowable、Completable几种观察者的区别,以及他们在什么场景用? RxJava切换线程是怎么回事? RxJava的subscribeOn只有第一次生效? RxJava的observeOn多次调用哪个有效? RxJava1.0、RxJava2.0、RxJava3.0有什么区别? RxJava中背压是怎么回事? RxJava怎么通过被订阅者传给订阅者的过程是什么样的?

通常我们写一个从订阅到发送数据的示例如下:

Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { emitter.onNext(1); emitter.onNext(2); emitter.onNext(3); emitter.onComplete(); } }).subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { Log.d(TAG, "onSubscribe:" + d.getClass().getName()); } @Override public void onNext(@NonNull Integer integer) { Log.d(TAG, "onNext: " + integer); } @Override public void onError(@NonNull Throwable e) { Log.d(TAG, "onError: " + e.getMessage()); } @Override public void onComplete() { Log.d(TAG, "onComplete"); } }); 复制代码

相信这是最简单的事件发送的示例,这没什么好说的,那它们是怎么发送数据,接收数据的呢,下面我会把代码拆分来看,因为现在是链式调用,我把代码拆分如下:

订阅过程

这里把创建observable和observer、以及发起订阅分别拆开来写,后面方便我们分析代码,首先是第一步发起订阅observable.subscribe(observer):

@Override public final void subscribe(@NonNull Observer


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3