zoukankan      html  css  js  c++  java
  • 写给小白的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的知识比较多,需要几篇能够说完也不确定,但是我会保证每一篇的质量!这篇借鉴了很多前辈的博客,尤其是上下游的概念。

    相关阅读:

    网红事件

    怎么样玩抖音

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

  • 相关阅读:
    RabbitMQ + PHP (二)AMQP拓展安装
    RabbitMQ + PHP (一)入门与安装
    使用 Selenium 实现基于 Web 的自动化测试
    Selenium私房菜系列4 -- Selenium IDE的使用
    解决火狐浏览器安装不上Selenium IDE插件“此附加组件无法安装”
    (技术分享) 解决 Firefox 显示“已阻止载入混合活动内容”的问题
    MyEclipse打开 HTML 报错Failed to create the part's controls
    python2x与python3x的区别
    Python基础总结
    Mycat 读写分离+分库分表
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309126.html
Copyright © 2011-2022 走看看