前言
这篇文章主要讲述一件事情,如何正确的定义我们程序中的 Observable,
下文中所有说到的信号,和我们常说的 RxJava发射的元素、Item、Error、Complete是同一类东西,但是我习惯叫它信号,在ObjectC中的Rac中也称之为信号
Observable 的种类
在 RxJava2 中,官方给我们定义了五种形式的[Observable]
- Observable 表示可以发射0-N个Item信号,当收到Complete信号或者Error信号结束,所以这里就有一种可能是成功发射了若干个然后失败,特别注意这点
- Flowable 从之前的 Observable 中分离出来的,有Observable 的特性的同时支持背压(后续文章会说,或者自行搜索)
- Single 表示只会发送一个信号或者一个Error信号就结束的Observable
- Maybe 表示只会收到一个Complete信号或者一个Item信号或者Error信号就结束的Observable
- Completeable 表示只会收到一个Complete信号或者Error信号就结束的Observable
真实代码中如何辨别使用哪种 Observable
其实上述几种情况都是 RxJava帮我们定义的一些常用的类型,下面就随便说几种普通代码和上面定义相符的情况
- 迭代集合中的元素 --> Observable
由于出发点是你想要处理集合中的 Item,那么针对的就是 集合中的 Item,而集合有多个 Item
// 就变成了一个可以发射 N 个 item 的 Observable 了
Observable observable = Observable.fromIterable(Iterable source);
// 相似方法针对数组的也有
Observable observable = Observable.fromArray(T... items);
- Single --> Observable
有时候我们拿到一个 Single,但是Single发射是一个集合,而我们后续想拿到集合中的元素进行操作,所以就有了下面的情况
List<String> list = new ArrayList<>();
list.add("123123");
Observable<String> observable = Single.just(list)
.flatMapObservable(new Function<List<String>, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(List<String> strings) throws Exception {
return Observable.fromIterable(strings);
}
});
- 网络请求 --> Single
其实我们定义 Retrofit Api 的方法的时候,通常很多人继承了 RxJava1 的习惯,或者压根不知道还有 Single,又或者根本分不清用哪个.
其实很简单,你发起一个网络请求,你只可能会受到一个 response 或者一个错误(可能是超时、服务器报错…),那么这种情况不就是上述 RxJava2 中帮我们定义的场景吗?它就是一个 Single
- 普通方法 --> Single
// 从数据库拿所有的订单对象
public List<Order> getAllOrderFromDb() {
// .....
}
这个也是需要使用 Single 去改为下面的代码,这里有少数人就有问题了,说这里不是一个 List对象吗?它里面不是有多个元素吗?不应该使用 Observable 或者 Flowable 吗?
注意上面的代码的方法是只会返回一个对象,不管这个对象是什么,它就只可能只有一个,不能根据对象里面还有元素去判别,如果非要用 Observable 的场景也不是没有,看下面的示例
// 从数据库拿所有的订单对象
public Single<List<Order>> getAllOrderFromDb() {
// .....
}
如果一定要和 Observable 相符的描述的话,下面的代码非常的符合.
因为我们它那里有可能会得到 0-N个 Item 元素,正好符合 Observable 的描述
// 从数据库拿所有的订单对象
public void getAllOrderFromDb(@Nonnull Callback<Order> callback) {
callback.accept(order1);
callback.accept(order2);
.....
}
还有一个情况
我们用过 RxBinding 的人应该知道,它可以把一个控件的点击事件给转化为 Observable
Observable<Object> o = RxView.click(bt_commit);
为什么这里就是一个 Observable,一定还是要牢记 Observable 的定义,因为点击事件是用户点击触发的,根本不知道用户会点击多少次,所以这正好也符合
- Completeable
// 取消订单
public void cancelOrder(String orderId){
// 去取消订单
}
这情况下没有返回值,方法调用成功了就表示成功结束了,如果出现异常就抛出一个异常,这种正好符合 Completeable ,类似的事情还有很多,切记 Completeable 的定义
- Flowable 和 Maybe
Flowable 其实多用于背压,其他的使用场景 Observable 足以,所以平常很少用到,后续会有单独的篇幅来介绍 Flowable 的,它的整体设计也和 Observable 有所差别
Maybe 这个操作符我平常真的没用到过,等我用到了再来更新一下文章