RxJava是ReactiveX在java平台上的实现。ReactiveX: An API for asynchronous programming with observable streams。stream可以是数据,也可以是事件。
本文基于RxJava 2.1.2描述基本使用,熟悉基本概念。在后面的文章中,名词会有大小写区分,observable表示可供订阅的意思,Observable表示RxJava中的io.reactivex.Observable类。同理observer表示订阅者,Observer表示RxJava中的io.reactivex.Observer接口。在链式调用中,操作符前面的称为上游,后面的称为下游。
导入依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.2'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
使用方法
RxJava的基本使用方式为
- 创建observable stream,即封装有数据或者事件的observable
- 用操作符组合或者变换stream
- 订阅observable stream并做出响应
- 必要时取消订阅
对应到代码中,大约会是这样
Disposable disposable = Observable.just("a", "b", "c") // 1.创建observable stream
.take(1) // 2.变换stream
.subscribe(new Consumer<String>() { // 3.建立订阅
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
disposable.dispose(); // 4.取消订阅
这样就实现了一个最基本的RxJava例子,我们对RxJava的实践最终都是和上面的一致。
下面继续了解具体的细节。
observable的创建
在RxJava中,有如下类可以作为observable,分别是Observable, Flowable, Maybe, Single, Completable,区别主要在于
类型 | 描述 |
---|---|
Observable | 发射0到多个数据,结束有sucess或者error事件 |
Flowable | 发射0到多个数据,结束有sucess或者error事件。支持背压,即允许控制source发射数据速度 |
Maybe | 发射0或者1条数据,或者error事件 |
Single | 发射1条数据或者error事件 |
Completable | 不发射数据,结束有success或者error事件 |
各observable的创建方法基本一致,以Observable为例,它提供了最基本的create方法,同时提供了如just, fromArray, fromIterator, fromCallable, fromFuture, interval等方式快捷创建observable。
Observable o = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
e.onNext("hello");
e.onComplete();
}
});
stream变换
Rxjava提供了一系列的操作符用于变换stream,操作符返回的同样是observable,方便连续变换。
以下随便列出几个操作符
操作符 | 描述 |
---|---|
observeOn | 指定下游observer执行的线程 |
suscribleOn | 指定上游observable发射消息所在的线程 |
cache | 缓存上游发送的所有事件重发给下游订阅者 |
map | 上游发射的数据处理后再发射到下游 |
flatmap | 上游发射的数据处理包装为Observable后发射到下游 |
建立订阅关系
订阅关系的建立主要是调用Observable的subscribe系列方法,最终都会调用到如下方法
public final void subscribe(Observer<? super T> observer)
上面的方法会建立最终订阅关系,不过由于需要管理订阅关系,所以一般不直接调用它,而是通过调用其它的subscribe方法间接调用到这里。
取消订阅
订阅后会返回Disposable对象,可以在必要时候手动调用Disposable.dispose()方法来切换订阅关系,比如android中onDestroy时需要取消网络请求。
CompositeDisposable可以看成是Disposable的集合,当有多个订阅关系即多个Disposable时,可以通过CompositeDisposable.add(disposable)放到一起,在必要的时候调用compositeDisposable.dispose()方法同时切断多个订阅关系。