知识点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()
知识点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等),即这之后的所有操作方法都会在最后一次调用指定线程中实现(我的理解:相当于多次调用顺序从上到下,是以最后一次指定线程为准。所以会有多次指定每指定一次切换一次的说法)