又开了个坑,学习一下RxJava
老规矩,继续用kotlin进行学习,java也能看懂,尽量写得通俗易懂,如果文章有错误,欢迎评论指正
首先我们尝试学一下一些基础的(?)
1、预备知识
1.1 异步
首先了解一下异步,原因是因为在RxJava在Github上的自我介绍:
a library for composing asynchronous and event-based programs by using observable sequences.
一个在JVM上使用可观测序列来组成异步的、基于事件的程序的库;
我们可以看出,RxJava与异步这个东西当然有比较深的联系,那么什么是异步?
异步是调用方在发出调用请求后可以继续执行之后的语句或行为,不必等待调用返回结果后再继续执行。
简单点说(?)
同步:妈妈喂我吃饭,妈妈喂我吃一口,我才能吃一口,但是我吃的时候妈妈不给饭我,要我吞下这口妈妈才给我
异步:爸爸喂我吃饭,爸爸把饭舀出来一口,放到盘中,我拿来吃,我在吃的过程中,爸爸继续把饭舀出来放到盘中,爸爸不用等我吃完再舀,而是不断地舀,舀完他就跑去玩,我自己一口一口吃完盘子里的就行了,当然,爸爸这个时候也可以把饭舀到姐姐盘里,即可以做舀给我饭之后的其他行为,不必等我恰完再做
1.2 观察者模式
被观察者通过订阅按顺序发送事件给观察者,观察者按顺序接收事件并作出相应的相应,这就是观察者模式
因为已经挺简单了,这里就不做简单来说了
在RxJava2中,我们可以使用两种方法实现观察者模式,他们分别是
(1)不支持背压:Observable(被观察者)& Observer(观察者)
(2)支持背压:Flowable(被观察者) & SubScriber(观察者)
1.3 背压
在异步的介绍中,我们看到爸爸不停地把饭舀出来,假设这个爸爸舀饭很快,我吃饭很慢,这样子盘子就会有越来越多的饭,如果盘子不够大,那么会有一个问题,那就是爸爸会因为盘子的饭太满摆不下了而把饭舀到垃圾桶,于是我们就会丢失一口饭,甚至很多口饭,这就是事件发出和接收严重不匹配,会造成丢失甚至oom
那么解决这个问题的方法是什么呢?即背压策略
在RxJava1.0
中,发送方发多少,接收方就接收多少,而在RxJava2
中,采用了Flowable
,即响应式拉取、反馈控制、采用背压策略模式
好,我们简单来说
就是爸爸喂饭,然后我恰了之后,回过头告诉爸爸我接下来能恰几口,爸爸知道我恰饭的速度之后控制自己舀饭的数量和速度,让我恰的舒服,也避免了盘子装满的风险。至于这个的具体实现,我会在接下来的内容讲到。
2、特点
吸引我来学习RxJava主要就是许多文章介绍的几个特点:
-基于事件流的链式调用
-逻辑简洁
-使用简单
当程序逻辑变得更为复杂时,它也能保持简洁。
3、基本使用
3.1 基本步骤
(1) 创建被观察者并产生事件
(2) 创建观察者并定义其对事件作出的相应动作
(3) 通过订阅连接被观察者和观察者
3.2 基本方法
(1)onNext(t: String)
:发送事件
(2)onError(e: Throwable)
:报错,若收到第二个onError()
则会导致程序崩溃
(3)onComplete()
:上游发送onComplete()
后可以继续发送,但下游收到onComplete()
后不再接收事件
(4)onSubscribe(d: Disposable)
:连接,订阅
3.3 例子
我们可以采用kotlin编写以下简单例子
// 上游 被观察者
val mObservable= io.reactivex.Observable.create(ObservableOnSubscribe<String> {
it.onNext("1")
it.onNext("2")
it.onNext("3")
it.onComplete()
//当上游发送了一个onComplete后,上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件
//当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件
//最为关键的是onComplete和onError必须唯一并且互斥,即不能发多个onComplete, 也不能发多个onError,
// 也不能先发一个onComplete, 然后再发一个onError,反之亦然,发送多个onComplete是可以正常运行的,
// 依然是收到第一个onComplete就不再接收了, 但若是发送多个onError, 则收到第二个onError事件会导致程序会崩溃.
})
//观察者
val mObserver = object : Observer<String>{
override fun onComplete() {
Log.d("onComplete", "88")
}
override fun onError(e: Throwable) {
}
override fun onNext(t: String) {
Log.d("onNext", "val:$t")
}
override fun onSubscribe(d: Disposable) {
Log.d("onSubscribe", "hi")
}
}
//建立订阅关系
mObservable.subscribe(mObserver)
}
当然,也可以使用Observable简单的写法来让我们的代码更简洁
val mObservable = Observable.create<String> {
it.onNext("1")
it.onNext("2")
it.onNext("3")
it.onComplete()
}
4、总结
参考了很多大佬的文章,勉强算是了解了RxJava,需要注意的是,在文章中我只用了creat
进行创建,但是RxJava中Observable
的创建方法有很多,包括creat
、just
等,大家可以去查看一下大佬的文章RxJava2操作符总结 – 你想要的都在这里了进行了解。接下来挖个坑,打算写一个小项目,综合利用一下RxJava等方法,尽快哈
5、参考文档
Android RxJava系列一: 基础常用详解
Android RxJava :图文详解 背压策略
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
RxJava2操作符总结 – 你想要的都在这里了