学习和运行RxJava,可以更好,更快,更方便开发Android。接下来,我们一起学习RxJava的基础知识。
学习RxJava之前,有两个知识必须要懂
- 响应式编程
响应式编程是一种基于事件驱动的模式,或者是一种面向数据流变化传播的模式。
比如$y=2x+b$,$y$的值变化要随着$x$和$b$的值变化而变化,在RxJava中,用容易地通过观察(Observing)$x$和$b$的值变化,从而实时地更新$y$的值。 - 线程
线程是执行完整或小段代码的单元。系统会自动分配执行时间给线程。在Android中,主要有两种类型线程:主线程(UI线程)和后台线程- 主线程是运行所有App执行UI操作。代码默认执行主线程。
- 后台线程是运行在后台,不会被前台或主线程打断。
如果我们的App执行需要下载一个视频代码,默认运行在主线程,则UI界面会阻塞,界面出现Application Not Response(ANR),直到下载完成。因此,运行长时间的任务,最好把它放在后台线程执行,此时RxJava可以快捷帮助我们解决该问题。
RxJava
RxJava是一个响应式编程和可以处理异步任务的库,一个可以观察数据流并且进行异步处理的接口。它的操作符可以很方便地处理数据流,如just, map, flatMap等等。
RxJava的好处
- 防止App的内存泄露
- 简化的代码
- 处理线程的同步问题
- 简单方便地处理异常
- 得心应手地切换线程
在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个策略处理背压状态。
- BUFFER 多余的数据先在缓冲区,等Observer忙完再处理,但如果数据过大或内存过小,还会抛出OOM。
- DROP 如果数量超出缓冲区的装载,则会抛弃这些数据。
- LATEST 只处理最近的数据,其余数据将会抛弃。
- ERROR 如果数据数量超出限制,则会抛出MissingBackpressureException。
- 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() 创建一个整数范围数组并逐一发送。