记:学习RxJava的小笔记

知识点1.简单了解RxJava

RxJava是基于事件流的链式调用,实现异步操作的库
RxJava属于一种特殊的观察者模式

知识点2.RxJava中4种角色

被观察者Observable:产生事件
观察者Observe:接收事件并作出对应的响应
订阅Subscribe:连接Observable和Observe
事件Event:Observable和Observe沟通载体

知识点3.原理

被观察者通过订阅按顺序发送事件给观察者,观察者按顺序接收事件并作出响应动作

知识点4.举例常用链式调用方法

导入包: compile "io.reactivex.rxjava2:rxjava:2.2.4"

        //第一步,先创建被观察者Observable
        Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(@NonNull ObservableEmitter emitter) throws Exception {
                //按顺序发送事件
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);

                //如果调用onComplete(),观察者会调用onComplete()方法
                emitter.onComplete();
                //2
            }
        }).subscribe(new Observer() {
            //第二步订阅
            //第三步创建观察者
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.e(TAG, "onSubscribe");
                //1
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                Log.e(TAG, "接收到:" + integer);
                //3
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e(TAG, "onError");

            }

            @Override
            public void onComplete() {
                Log.e(TAG, "onComplete");
                //4
            }
        });

打印结果:

12-18 11:31:44.314 32019-32019/test.danny.com.rxjavademo E/MainActivity: onSubscribe
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: 接收到:1
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: 接收到:2
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: 接收到:3
12-18 11:31:44.315 32019-32019/test.danny.com.rxjavademo E/MainActivity: onComplete

由此可知(也可看上面数字标注顺序1234)回调执行顺序为:
观察者onSubscribe>被观察者subscribe()>onNext()>onComplete()

知识点5.丰富的操作符

https://www.jianshu.com/u/383970bef0a0
//2018-12-19 作者下面非常全,我还没学完(map,flatMap,contactMap,Buffer)...

知识点6.RxJava无条件网络请求轮询

https://www.jianshu.com/p/11b3ec672812

知识点7.创建观察者两种方式的区别(Observable、Subscriber)

相同:使用完全相同(在实际使用中,Observable总被转换成Subscriber)
不同:Subscriber扩展了Observable,新增了onStart()和unsubscribe()方法

知识点8.Disposable

当执行到了观察者的onComplete()或onError(),就相当于切断了观察者和被观察者之间的联系。同时若自行调用了Disposable.dispose(),也是切断了联系

知识点9.变换操作符

(此处可使用操作符非常多,以后继续补充)
应用场景:网络嵌套,即执行完接口1,再执行接口2
(1)Map():将被观察者发送的事件转换为任意的类型事件
Observable>发送事件>Map转换发送转换后事件>订阅>观察者接收到的是转换后的事件
(2)flatMap():将被观察者发送事件序列进行拆分&单独转换,在合并成一个新的事件序列,在发送
原理:
a.为事件每个事件创建1个Observable对象
b.将每个原始事件转换后新事件都放入对应的Observable对象
c.将新建每一个都合并到新建的总的Observable对象
d.把新建的总的Observable对象发给Observer观察者
注意:新的Observable对象事件是无序
(2)concatMap():与flatMap()类似,区别在于flatMap()最后新的事件顺序是无序,而concatMap是有序
(3)Buffer():定期从Observable需发送事件中,获取一定数量事件放缓存区,并最终发送

知识点10.几点RxJava原理个人理解

(1)Observable是采用链式调用,和我们平时使用的Builder建造者模式不同的是,平时builder每次返回都是同一个对象。而在这里,返回是每次都会创建一个新的Observable或Observable的子类
(2)所有的业务都是在执行了subscribe()方法之后执行的,观察者回调了被观察者的subscribe(),并把订阅者以参数的形式交还给事件源,将它们连接了起来。被观察者onSubscribe中发送的事件,其实相当于观察者的onNext()

记:学习RxJava的小笔记_第1张图片
subscribe部分理解.png

知识点11.map操作符原理?不是很懂,希望有懂的能给我指点一下

大概意思是,创建新的观察者与被观察者,但是被观察者的onSubscribe()一直回调是之前的,逐级建立订阅。执行顺序不是顺序执行,而需回调来执行???

知识点12.线程切换(*)
为什么会用到线程切换?

当被观察者在subscibe发送耗时的任务时,为了不堵塞主线程。因为Observable和Observe,创建在哪个线程,方法就会执行在哪个线程

理想型怎么实现?

被观察者在子线程中执行耗时操作,回调给观察者在主线程进行UI处理。使用线程切换,也称为调度/切换

如何实现?

RxJava内置调度器(Scheduler):可以指定Observable及Observe的工作线程
被观察者Observable:subscribeOn(Schedulers.newThread()))(Schedulers有多个可选的方式可自行baidu)切换此线程进行耗时操作
观察者Observe:observeOn(AndroidSchedulers.mainThread())切换主线程处理结果(内部使用了Handler)

线程切换原理?

附一个地址觉得讲得很好https://www.jianshu.com/p/4e78d447394e
subscribeOn(Schedulers.newThread():原理就是在指定线程中向上游订阅(白话就是在指定线程中去调上游的subscribe方法,x我理解的是:相当于多次调用,之后的每次指定线程都依次向上,直到第一个指定的位置。所以会有多次指定只有第一次有效的说法)
observeOn(AndroidSchedulers.mainThread():原理是收到数据后在指定的线程中调用下游的回调方法(onNext/onError/onComplete等),即这之后的所有操作方法都会在最后一次调用指定线程中实现(我的理解:相当于多次调用顺序从上到下,是以最后一次指定线程为准。所以会有多次指定每指定一次切换一次的说法)

记:学习RxJava的小笔记_第2张图片
线程切换简单理解顺序.jpg

你可能感兴趣的:(记:学习RxJava的小笔记)