一个菜鸡的RxJava入门基础学习

1 篇文章 0 订阅
1 篇文章 0 订阅

又开了个坑,学习一下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的创建方法有很多,包括creatjust等,大家可以去查看一下大佬的文章RxJava2操作符总结 – 你想要的都在这里了进行了解。接下来挖个坑,打算写一个小项目,综合利用一下RxJava等方法,尽快哈

5、参考文档

Android RxJava系列一: 基础常用详解
Android RxJava :图文详解 背压策略
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
RxJava2操作符总结 – 你想要的都在这里了

(他们写的真的都比我的好)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值