• 主页
所有文章 关于我

  • 主页

RxJava在Android的应用

2019-04-23

学习和运行RxJava,可以更好,更快,更方便开发Android。接下来,我们一起学习RxJava的基础知识。

学习RxJava之前,有两个知识必须要懂

  1. 响应式编程
    响应式编程是一种基于事件驱动的模式,或者是一种面向数据流变化传播的模式。
    比如$y=2x+b$,$y$的值变化要随着$x$和$b$的值变化而变化,在RxJava中,用容易地通过观察(Observing)$x$和$b$的值变化,从而实时地更新$y$的值。
  2. 线程
    线程是执行完整或小段代码的单元。系统会自动分配执行时间给线程。在Android中,主要有两种类型线程:主线程(UI线程)和后台线程
    • 主线程是运行所有App执行UI操作。代码默认执行主线程。
    • 后台线程是运行在后台,不会被前台或主线程打断。

如果我们的App执行需要下载一个视频代码,默认运行在主线程,则UI界面会阻塞,界面出现Application Not Response(ANR),直到下载完成。因此,运行长时间的任务,最好把它放在后台线程执行,此时RxJava可以快捷帮助我们解决该问题。

RxJava

RxJava是一个响应式编程和可以处理异步任务的库,一个可以观察数据流并且进行异步处理的接口。它的操作符可以很方便地处理数据流,如just, map, flatMap等等。

RxJava的好处

  1. 防止App的内存泄露
  2. 简化的代码
  3. 处理线程的同步问题
  4. 简单方便地处理异常
  5. 得心应手地切换线程

在RxJava中,任何的东西都可以看做数据流,数据流可以随时发送数据或事件,且可被观察或消费。比如数据流可包括点击事件,推送通知,数据更新等等。

RxJava的核心

RxJava的核心

Obserable(可观察者)

顾名思义,它可以被观察的,它有点类似发送器,可以不断发送数据或者事件。

  • 只有在订阅者订阅了才开始发送数据。
  • 可以无数次发送数据。
  • 可以永不停止地发送数据。

Observer(观察者)

它可以观察和接收来自可观察者(Observable)发送的数据,且可接收通过操作符(Operator)处理的数据。
例子:两个人在交谈,一个人只会讲英文,一个人只会听中文,当他们交流时,需要一个翻译器(Operator),它可以把说话者(Obserable)说的语言转化为聆听者(Observer)能听懂的语言。

观察者(Observer)一旦订阅可观察者(Observable),即可接收可观察者通过调用观察者的方法发送的数据或事件。
观察者方法

  • onSubscribe 当观察者订阅时被可观察者调用。
  • onNext 当数据流有数据发送时调用,可以多次。
  • onError 当有异常时调用。
  • onComplete 当任务结束时调用。

Observer的生命周期

观察者生命周期

Observable和Observer对应的类型

类型对比

1. Flowable与Observable

Flowable和Obserbable的区别在于Flowable支持背压。

解释背压,比如一个场景Observable每秒发送100个数据,而Observer却每秒处理10个数据,这次Observer处于背压状态,如果缓冲区空间满载,则出现内存泄露(OutOfMemoryException)。

Flowable有5个策略处理背压状态。

  1. BUFFER 多余的数据先在缓冲区,等Observer忙完再处理,但如果数据过大或内存过小,还会抛出OOM。
  2. DROP 如果数量超出缓冲区的装载,则会抛弃这些数据。
  3. LATEST 只处理最近的数据,其余数据将会抛弃。
  4. ERROR 如果数据数量超出限制,则会抛出MissingBackpressureException。
  5. MISSING 不做任何策略,数据不会被抛弃或缓存,之后也会抛出MissingBackpressureException。

2. Single与Single Observer

Single 只会发送一次数据或调用onError(),通常用于请求网络API。

3. Completable & Completable Observer

不发送任何数据,只调用onComplete()或onError()。

4. Maybe & MaybeObserver

要么不发送任何数据,要么只发送一次数据,或者调用onError()。

操作符(Operator)

操作符相当于一个翻译器或转换器。

  • Map() 可以把发送数据转换另一种数据。
  • FlatMap() 有点类似Map(),但是它返回一个可观察者,继续被观察者订阅。
  • Create() 可以创建Observable或Flowable。
  • Just() 把数据转化为Observable,并发送。
  • Timer() 创建一个可以轮训的Observable。
  • Range() 创建一个整数范围数组并逐一发送。
赏

谢谢你请我吃糖果

  • Android
  • RxJava

扫一扫,分享到微信

微信分享二维码
了解Kotlin的协程
技巧地使用Gradle
© 2022 Zhuohao Yuan
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

  • Android
  • OpenCV
  • NDK
  • Tensorflow
  • Deep Learning
  • Machine Learning
  • Kotlin
  • RxJava
  • Gradle
  • Coroutine
  • Flutter

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

I'm
  deeply diving into
    Machine Learning