写给小白的RxJava教程(一)

 简介:大三学生党一枚!主攻Android开发,对于Web和后端均有了解。

个人语录:取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客。

一.RxJava简单介绍

可能刚接触RxJava的朋友并不知道RxJava真正的作用是什么,看书上说的什么函数响应式编程,极大的简化项目,感觉说了和没说一样,还是不了解它的作用是什么!可以用一个对比来简单描述RxJava的优点。

Android开发过程中,登录操作很常见。用常规操作来实现,必须在子线程中去访问网络,然后借助Handler切换到主线程更新UI,需要复杂的操作来实现这个简单的功能。但是使用RxJava只需要一行代码就能搞定!从这个案例中,我们可以看出对于开发者来说RxJava最大的优点就是简化项目,各种链式操作保持清晰的逻辑。

要使用RxJava需要先引入依赖:

implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
 implementation 'io.reactivex.rxjava2:rxjava:2.1.3'

二.RxJava的理解

先介绍两个关键的名词
Observer:观察者 可以理解为消费者
Observable:被观察者 可以理解为生产者
当被观察者发生变化时,会立即通知观察者!

2.1 上下游的比喻

如图所示:
在这里插入图片描述

  • Observable作为上游,水流源源不断的经过纽带流往下游
  • 纽带:当纽带被关闭时,水流就无法流到下游,纽带开启,水流到达
  • Observer作为下游,收到上游的水流。
  • 水流:就是事件

这里结合一段最简单的RxJava代码来解释

Observable.create(new ObservableOnSubscribe<Integer>() {
                   //上游 Observable
                   @Override
                   public void subscribe(ObservableEmitter<Integer> e) throws Exception {            //向水流中添加一个next事件,传递给下游有对应接收next事件的方法
                       e.onNext(1);
                      //在水流中的是一个complete事件,传递给下游有对应接收next事件的方法
                       e.onComplete(2);
                   }
               })
               .subscribe(
               //subscible 就是纽带,将上下游连接起来
               new Observer<Integer>() {
                   //observer 表示 下游
                   Disposable d;
                   //Disposable表示纽带开关
                   @Override
                   public void onSubscribe(Disposable d) {
                       this.d=d;
                   }
                   @Override
                   public void onNext(Integer integer) {
                       //用来接受上游的next事件
                       Log.d(TAG, "onNext: "+integer);
                   }
                   @Override
                   public void onError(Throwable e) {
                       Log.d(TAG, "onError: "+e.getMessage());
                   }
                   @Override
                   public void onComplete() {
                      //用来接受上游的complete事件`在这里插入代码片`
                       Log.d(TAG, "onComplete ");
                   }
               });

整个过程一气呵成,一段代码搞定事件传递。

2.2 浅观设计模式

从设计模式角度来看RxJava,观察者模式又被称为发布——订阅模式。最典型的案例就是微信公众号,微信用户订阅微信公众号,当微信公众号产生新消息时,所有订阅了该微信公众号的用户,都能收到该消息。这就是观察者模式最核心的思想。

微信公众号:被观察者(Observable
微信用户:观察者(Observer)

对应于上下游的案例,上游产生水流下游就会接受到!
上游:被观察者(Observable
下游:观察者(Observer)

由于本篇主要介绍RxJava,关于设计模式就不深入。

三.RxJava基础知识

在上面的代码中出现了ObservableEmitterDisposable

3.1 ObservableEmitter

ObservableEmitterEmitter是发射器的意思,他就是用来发出事件的,他可以发出三种类型的事件,通过调用emitteronNext(T value)onComplete()onError(Throwable error)就可以分别发出next事件、complete事件和error事件。

发出事件需要遵守一定的规则

  • onNext():上游可以发出多个onNext事件下游也能接受到很多个onNext事件。
  • onComplete():上游发出一个onComplete事件后,可以继续发出其他事件,但是下游接受到onComplete事件以后,就停止接收事件。
  • onError():和onComplete相同,上游发出onError事件后继续发出其他事件,而下游接收到onError事件后不再接收事件。
  • 上游可以不发出onComplete和onError事件
  • onCompleteonError必须互斥且唯一,不可以同时发出多个onComplete事件也不可以同时发出多个onError事件,也不可以先发出onComplete事件再发出onError事件,反之亦然。

3.2 Disposable

他就相当于我们之前提到的纽带,当纽带被关闭即调用disposable.dispose()方法,下游就接收不到上游发出的任何事件。但这并不影响上游继续发出事件。

四.简单的RxJava案例

Observable.create(new ObservableOnSubscribe<Integer>() {
                   //被观察者
                   @Override
                   public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                       e.onNext(1);
                       Log.d(TAG, "subscribe: next1");
                       e.onNext(2);
                       Log.d(TAG, "subscribe: next2");
                       e.onComplete();
                       Log.d(TAG, "subscribe: complete");
                       e.onNext(3);
                       Log.d(TAG, "subscribe: next3");
                   }
               }).subscribe(new Observer<Integer>() {
                   //观察者
                   Disposable d;
                   @Override
                   public void onSubscribe(Disposable d) {
                       this.d=d;
                   }
                   @Override
                   public void onNext(Integer integer) {
                       //Disposable能够切断水管
                       Log.d(TAG, "onNext: "+integer);
                   }
                   @Override
                   public void onError(Throwable e) {
                       Log.d(TAG, "onError: "+e.getMessage());
                   }
                   @Override
                   public void onComplete() {
                       Log.d(TAG, "onComplete ");
                   }
               });

查看log日志如图:

在这里插入图片描述
可见当上游发出onComplete事件被下游接收以后,上游可以继续发出事件,而下游不再接收。

我们在实验一下Disposable的作用

Observable.create(new ObservableOnSubscribe<Integer>() {
                   //被观察者
                   @Override
                   public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                       e.onNext(1);
                       Log.d(TAG, "subscribe: next1");
                       e.onNext(2);
                       Log.d(TAG, "subscribe: next2");
                       e.onComplete();
                       Log.d(TAG, "subscribe: complete");
                       e.onNext(3);
                       Log.d(TAG, "subscribe: next3");
                   }
               }).subscribe(new Observer<Integer>() {
                   //观察者
                   Disposable d;
                   @Override
                   public void onSubscribe(Disposable d) {
                       this.d=d;
                   }
                   @Override
                   public void onNext(Integer integer) {
                       //Disposable能够切断水管
                       if(integer>=2){
                       //当Integer大于2的时候关闭纽带,下游接受不到任何事件,上游可以继续发送
                           d.dispose();
                       }
                       Log.d(TAG, "onNext: "+integer);
                   }
                   @Override
                   public void onError(Throwable e) {
                       Log.d(TAG, "onError: "+e.getMessage());
                   }
                   @Override
                   public void onComplete() {
                       Log.d(TAG, "onComplete ");
                   }
               });

在这里插入图片描述

总结

RxJava的知识比较多,需要几篇能够说完也不确定,但是我会保证每一篇的质量!这篇借鉴了很多前辈的博客,尤其是上下游的概念。

相关阅读:

网红事件

怎么样玩抖音

抖音新主播直播间没人气怎么办

原文地址:https://www.cnblogs.com/hzcya1995/p/13309126.html