RxJava面经一,拿去,不谢! |
您所在的位置:网站首页 › rxjava面试题 › RxJava面经一,拿去,不谢! |
大家都知道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的时候会返回。这里以一种最基本的订阅来介绍它们之间的关系:
注:该篇源码分析会基于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 |